PI Services

Le blog des collaborateurs de PI Services

Passer du BootLoader de Windows 8 à Windows 7

 

Vous aviez sur votre poste Windows 7 et vous venez d’installer Windows 8 sur une seconde partition.

image

Windows 8 étant le dernier système d’exploitation à avoir été installé, vous serez donc confronté au bootloader de Windows 8. Cependant, la procédure de démarrage de Windows 8 détient une petite subtilité. Contrairement au gestionnaire de boot de Windows 7, celui de Windows 8 ne sera affiché qu’après chargement de ce nouvel OS.

clip_image001

Cela signifie que si vous souhaitez démarrer sous Windows 7, l’ordinateur va alors de nouveau redémarrer pour booter sur Windows 7. Cette situation peut être contraignante en termes de temps.

Nous allons donc voir comment remettre le BootLoader de Windows 7.

Démarrons par exemple sous Windows 8. (La méthode fonctionne également sous Windows 7)

Dans notre explorateur, on peut voir que la partition C : correspond à notre Windows 8.

Sur la partition D : est donc présente l’installation de Windows 7.

clip_image002

Ouvrez une commande cmd avec les droits administrateurs.

Tapez :

bcdboot d:\windows

(d: étant la partition hébergeant Windows 7)

la réponse suivante s’affiche

Sans titre2

Les fichiers de boot viennent alors de se mettre à jour.

Maintenant en redémarrant,

clip_image005

Le bootLoader de Windows 7 est désormais restauré.

Exchange 2010 – Retrouver les permissions d’une boite

On a souvent besoin de connaitre les permissions affectées à une boite aux lettres.

Le script ci-dessous permet d’obtenir les droits mis en place par un administrateur

(send as , send on behalf, full access) ainsi que les droits donnés par l’utilisateur

via Outlook.

Voici le résultat:

image

Le script peut s’utiliser de deux façons.

Utilisation en indiquant un argument:


./getmailboxperm.ps1 jean@domaine.fr
 
Utilisation avec une invite de saisie:

image

Il faut bien entendu adapter le script au choix souhaité.

Bonne utilisation.

############################################################################
# Affiche les droits spécifiques sur une boites ainsi que les autorisations MAPI Exchange 2010
#############################################################################
 
 
#/*MBX Permission*/

#/*Utilisation avec argument (exemple) : ./getmailboxperm.ps1 pascal@domaine.fr

#$Email=$Args[0]
 
#/*Utilisation avec une invite de saisie

$Email = read-host -prompt "Entrez l'adresse de messagerie "
 
[string]$Mailbox = Get-Mailbox -Identity $Email
 
Write-Host

Write-Host "*******************************************************************************" -foregroundcolor yellow
Write-Host "*********** Autorisation sur la boite de $Email" -foregroundcolor red
Write-Host "*******************************************************************************" -foregroundcolor yellow
Write-Host

#/*Full Access*/
$FullAccess = Get-MailboxPermission $Email | where { ($_.AccessRights -eq "FullAccess") -and ($_.IsInherited -eq $false)  -and -not ($_.User -like "NT AUTHORITY\SELF") } | Select User
Write-Host "Contrôle TOTAL:" -foregroundcolor Green
Write-Host
Foreach ($User in $FullAccess)
  {
   Write-Host $User.User
  }
Write-host
#/*Send As*/
#Get-ADPermission -Identity $Sam | Where {$_.ExtendedRights -like "Send-As" -and $_.User -notlike "NT AUTHORITY\SELF" -and $_.Deny -eq $false} | ft Identity,User,ExtendedRights,IsInherited
$SendAs = Get-ADPermission -Identity $Mailbox | Where {$_.ExtendedRights -like "Send-As" -and $_.User -notlike "NT AUTHORITY\SELF" -and $_.Deny -eq $false} | Select User
Write-Host "Envoyer en tant que (send as):" -foregroundcolor Green
Write-host
Foreach ($User in $SendAs)
  {
   Write-Host $User.User
  }
Write-Host
#/*Send on Behalf*/
#$SendOnBehalf = get-mailbox -Identity $Email | Select GrantSendOnBehalfTo
$SendOnBehalf = get-mailbox -Identity $Email | Select @{Name="SendOnBehalf";Expression={$_."GrantSendOnBehalfTo"}}
Write-Host "Envoyer de la part de:" -foregroundcolor Green
Write-Host
Foreach ($User in $SendOnBehalf)
  {
   Write-Host $User.SendOnBehalf
  }
Write-Host
#/*MailboxFolders*/
$folders = Get-MailboxFolderStatistics -Identity $Email | Where {$_.Foldertype -ne "SyncIssues" -and $_.Foldertype -ne "Conflicts" -and $_.Foldertype -ne "LocalFailures" -and $_.Foldertype -ne "ServerFailures" -and $_.Foldertype -ne "RecoverableItemsRoot" -and $_.Foldertype -ne "RecoverableItemsDeletions" -and $_.Foldertype -ne "RecoverableItemsPurges" -and $_.Foldertype -ne "RecoverableItemsVersions" -and $_.Foldertype -ne "Root"} | select folderpath
 
Write-Host "Dossiers de la boîte :" -foregroundcolor Green
Write-Host
Foreach ($Folder in $folders)
  {
   Write-Host $Folder.Folderpath
  }
Write-Host
 
#/*MAPI Permissions*/
Write-Host "MAPI Permissions:" -foregroundcolor Green
Write-Host
get-mailboxfolderpermission -identity $Email":\" | ft foldername, User, AccessRights
Foreach ($Folder in $folders)
  {
   $NormalizedFolder = $Folder.FolderPath.Replace("/","\")
   $NormalizedIdentity = $Email + ":" + $NormalizedFolder
   get-mailboxfolderpermission -identity $NormalizedIdentity | ft foldername, User, AccessRights
  }

Lync Server 2010 : Installation Failed wmf2008R2

 

Lors de l’installation de Lync Server 2010 sur un serveur exécutant Windows Server 2008 R2 SP1, un erreur peut se produire sur le composant Wmf2008R2:

clip_image002

Pour cibler cette erreur, vous pouvez explorer le fichier de log mais ce dernier ne nous avance pas sur la raison de cette erreur:

clip_image001

Apres quelques recherches, il s’avère que l’installeur Lync server 2010 n’arrive pas a localiser Microsoft Windows Média Format et de ce fait ne réussi pas a l’installer.

Afin de palier a cette erreur vous devez installer manuellement Windows Media Format. Pour cela suivez les étapes suivantes:

              1. Server Manager
            1. Add Features
            2. Select Desktop Experience option
            3. Click Next, and then click Install

 

clip_image003

Une fois l’installation réaliser, le redémarrage du serveur est nécessaire.

Une fois le serveur redémarrer, relancer l’installation de lync Serveur. L’erreur est maintenant corriger et l’installation peut se poursuivre.

clip_image004

Microsoft a répertorié cette erreur sous la KB2522454

http://support.microsoft.com/kb/2522454

ACTIVE DIRECTORY– Utilitaire DSQUERY

Microsoft met à disposition un utilitaire très utile qui permet d’obtenir des informations

sur les objets de l’annuaire.

Un premier exemple, recherchons les comptes qui n’ont pas été utilisés depuis plus de

quatre semaines du domaine courant :

dsquery user domainroot -name * -inactive 4

"CN=Jean AIMARRE,CN=Users,DC=lab,DC=ad"

On peut varier l’affichage, ici par UPN

dsquery user domainroot -name * -inactive 4 -o upn

jean.aimarre@lab.ad

Un second exemple pour retrouver les comptes désactivés dont le champ name commence

par ar :

dsquery user domainroot -o upn -name ar* –disabled

ronald.ardon@lab.ad

Un dernier exemple, on recherche le DC maitre de schéma:

dsquery server -forest -hasfsmo schema


"CN=DC1,CN=Servers,CN=Siege,CN=Sites,CN=Configuration,DC=lab,DC=ad"

                                  **********************************

On peut faire des requêtes sur les utilisateurs,les groupes,les contacts,les OUs,les sites,

les serveurs,les ordinateurs,les quotas et les partitions.

Pour plus d’informations: http://technet.microsoft.com/fr-fr/library/cc725702(v=ws.10)

Threat Management Gateway 2010 – Redirection d’URL.

 

Lors de la publication Outlook Web App sur TMG 2010, le choix de rediriger l’url HTTP

automatiquement vers une url sécurisée HTTPS est souvent retenue.

La technique retenue est souvent mise en œuvre par une première règle en “deny”

qui redirige sur la règle autorisée sécurisée.

image

Malgré tout, vous pourrez en fonction de ce qui est installé sur le serveur être

surpris que cette “mécanique” ne fonctionne pas Triste.

Si vous lancez une URL de type http://monwebmail.fr , il ne se passera rien (pas de code

retour http).

C’est le cas si vous installez le rôle Exchange 2010 EDGE avec TMG 2010.

Dans le journal d’évènement Windows ou TMG vous verrez ce type d’erreur après

le démarrage du service TMG FireWall :

image

Cela indique que TMG ne peut “lier” une règle sur le port 80 car celui-ci est

déjà lié à un autre service !

En lançant la commande netstat on remarque bien que le port 80 n’est pas lié

à l’adresse IP définie dans la règle de TMG:

image

utilisez un utilitaire comme NETSH (netsh http show servicestate) ou ProcessViewer

pour déterminer le “coupable”.

Dans mon cas par défaut l’installation du EDGE installe le composant IIS.

Il suffit d’arrêter le service “World Wide Web Publishing Service” et de le désactiver

puis de relancer le service TMG FireWall.

Vérifiez avec NETSTAT:

image

L’adresse IP définie dans la règle “DENY” est maintenant liée au port 80 et en écoute.

La requête HTTP peut donc maintenant être rediriger vers la règle HTTPS. Sourire

EXCHANGE 2010 – Personnalisation des “bannières SMTP” du connecteur de réception.

 

Une session SMTP renvoie certaines informations et plus particulièrement le nom

du serveur que l’on souhaite dans certains cas modifier.

Sous Exchange 2010 les informations renvoyées par la connexion (220) et par l’initialisation

de la session (helo, 250) sont “personnalisable”.

Voici un aperçu typique par défaut:

image

Pour modifier les informations renvoyées  par la connexion (220) il faut utiliser une commande PowerShell.

Affichons la configuration initiale (par défaut):

image

L’attribut “Banner” est vide , malgré tout des informations par défaut sont renvoyées.

(Ligne 1 ).

L’attribut “Fqdn” qui est renvoyé après le “helo” à par défaut le nom DNS du serveur.

(Ligne 2 ).

Modifions l’information renvoyé à la connexion:

Set-ReceiveConnector "MyConnector" -Banner "220 Welcome"

Modifions l’information renvoyé après la commande “helo”:

Set-ReceiveConnector “MyConnector" -Fqdn "PostFix.fr"

(Cette dernière configuration peut être modifiée dans l’interface graphique).

Ce qui donne:

image

Désactivation de la recherche de profil supprimé dans USMT

Lors de l’utilisation de scanstate (outil USMT), il se peut que vous ayez des problèmes d’accès sur certains profils. Cela peut se produire quand un profil sur l’ordinateur n’a pas été supprimé proprement.

Par exemple un profil utilisateur a été supprimé depuis l’explorateur et non depuis les paramètres système avancés è Profil des utilisateurs .

Dès que cela se produit, le mécanisme par défaut de USMT tente sous 20 reprises de charger le NTUSER.dat de ce profil non trouvé.

image

Cela a pour cause de prolonger le temps de traitement de scanstate.

Pour désactiver les tentatives répétés d’accès à des profils supprimé, une variable peut être définit : MIG_IGNORE_PROFILE_MISSING

Il suffit de définir cette variable à 1 et l’outil Scanstate ne tentera plus d’accéder de manière répété aux profils absent : SET MIG_IGNORE_PROFILE_MISSING=1

Affecter dynamiquement une lettre de disk drive disponible dans un script Powershell

 

Imaginons que vous deviez effectuer un net use dans un script sur plusieurs machines mais que les disks drive disponible ne soit pas les mêmes. Pour cela, nous allons consulter le registre.

Dans le registre, chaque disk drive monté apparait dans HKCU\Network

Exemple :

Un net use

image

Sous le registre

image

 

Avec la cmdlet Get-Random, nous pouvons emprunter une lettre pour un disk drive aléatoire et voir si la clé dans le registre au niveau de HKCU\network est retrouvé par notre valeur obtenu du Get-Random . Si cela n’est pas le cas, cela veut dire que la lettre est disponible pour notre disk drive.

 

Récupérer une lettre disponible dans une variable

Pour notre cmdlet get-random, nous définissons une collection de valeur allant de o à z.

Pour chaque valeur obtenue, nous allons vérifier si la clé correpondante dans le registre sous HKCU\Network existe. La variable récupérera donc une valeur qu’il comparera au registre.

do {$MapDest=get-random -input "o","p","q","r","s","t","u","v","w","x","y","z"; get-childitem "registry::HKEY_CURRENT_USER\Network\$MapDest"; $check=$?} while ($check -eq "true")

Notre variable a maintenant une lettre de lecteur disponible pour un mappage de lecteur réseau. Il ne reste plus qu’à ajouter à notre variable $MapDest le caractere “:”

$MapDest=("$MapDest :").replace(" ","")

La variable peut maintenant être utilisé pour un mappage : net use $MapDest \\path

Authentification avec prise en charge des fournisseurs installés avec Windows PowerShell

La commande get-credential obtient un objet credential (informations d'identification) basé sur le nom et mot de passe d'un utilisateur.

Cependant, cette commande est incompatible avec les fournisseurs installés avec Windows Powershell.

Exemple d’une copie de fichier sans crédential

clip_image002

Maintenant, essayons en spécifiant un utilisateur.

clip_image004

image

clip_image008

On peut donc voir que le fournisseur n’est pas compatible en définissant un crédential.

Maintenant, nous allons voir comment permettre une authentification via le module impersonation disponible à cette adresse : http://poshcode.org/get/1867

Cette astuce devra être exécuté avec Powershell en mode STA : Single-Threaded Apartments car le module que nous allons importer n’est compatible que dans ce mode.

Exécuter :

clip_image010

(En mode STA, la fenêtre Powershell est noir par défaut)

clip_image012

Maintenant on récupère notre variable d’authentification comme auparavant.

clip_image014

Si on exécute une copie de fichier avec la variable $cred, on peut voir que cela ne fonctionne toujours pas.

clip_image016

Maintenant, on va importer le module « impersonation » qui va mettre à notre disposition trois nouvelles commandlets.

clip_image018

A l’aide de Push-ImpersonationContext, on va maintenant récupérer notre variable $cred. Et à partir de là, on peut réessayer une copie de fichier qui auparavant ne fonctionnait pas.

clip_image020

Cela fonctionne désormais.

Pour effacer de la mémoire l’authentification, nous avons la variable Pop-impersonationContext disponible.

Exemple :

Nous supprimons le fichier copié là où celui-ci a fonctionné auparavant et nous utilisons la cmdlet Pop-impersonationContext. Nous réessayons donc une nouvelle fois notre copie de fichier :

clip_image022

Cela a bien supprimé l’authentification gardé en mémoire.

Autre exemple d’authentification pour la création d’un item  (même principe):

clip_image024

Powershell: Acces aux variables entre Session locale et session distante.

Independemment de la portabilité des variable dans un script, un problème se pose lorsque vous souhaitez, dans un script, accéder des variable locales depuis des commandes executées sur une machine distante.

Exemple:

 

$vmmserver="monserveurvmm.home.com"
$VmToStop="c:\BackupAdmin\VMToStop.txt"

if (!(test-path $VmToStop))
{
write-host "le fichier des VM $VmToStop a eteindre introuvable. le script va s'arreter"
Exit
}
else
{
$VmToStop= Get-Content $VmToStop
foreach ($vm in $VmToStop)
{

        Invoke-Command -ComputerName $vmmserver -ScriptBlock {
        param($vm,$vmmserver)

        Add-PSSnapin microsoft.systemcenter.virtualmachinemanager
        $vmstatus= (get-vm -Name $vm -VMMServer $vmmserver | Select-Object -Property status)
        if ($vmstatus.status -eq "running")
            {
            write-host "La VM $vm est démarré et va etre arretée"
            Shutdown-VM -VM $vm
            }
            elseif ($vmstatus.status -eq "PowerOff")
            {
            write-host "La VM  $vm est déja arrétée"
            Exit
            }
        } -Argumentlist $vm,$vmmserver
}
}       

##################################

 

Dans ce script qui recherche dans un fichier “VMToStop.txt” une liste de machine virtuelles a arrêter, un bloc de commande est executé a distance (Invoke-Command -ComputerName $vmmserver -ScriptBlock { } ) sur un serveur scvmm. Comment faire en sorte que les commandes executées a distance connaissent les variables locales $vm et $vmmserver ?

param($vm,$vmmserver) va permettre de declarer une liste de variable dans le ScriptBlock

-Argumentlist $vm,$vmmserver va permettre de faire la liaison entre le contenu de param et les variables locales.

A noter que le nom des variables déclarées par param est arbitraire, mais il est nécéssaire que ces variables soit dans le meme ordre que celles de –Argumentlist .