Win7: Gérer les Network Locations en .Net et PowerShell (1/2)
Cet article signe la reprise d’une longue absence de ma part sur ce blog. J’ai quelques sujets très intéressant à partager avec vous. Je commence donc par celui-ci qui est de savoir comment gérer les Network Locations (remplaçant des Network Places en WinXP) via script (PowerShell) ou VB.Net. |
1. Petit rappel concernant les Mapped drive et Network Location
A. Mapped Drive
Cette opération permet de lié une ressource réseaux de type UNC (ex: \\ServerName\Share\) à une lettre de lecteur (ex: E:\).
L’objectif est de créer un moyen pratique pour accéder et partager des données en ne référençant qu’une lettre à la place du chemin (UNC) complet de la ressource.
D’autre part, en entreprise, il est assez facile de grouper les utilisateurs d’une même ressource réseaux en l’associant à une lettre de lecteur commune. Prenez l’exemple d’un répertoire partagé portant le nom Marketing se situant sur un serveur portant le nom de ServerA. On peut imaginer que l’ensemble des membres de la division Marketing se voit attribuer la ressource \\ServerA\Marketing sur la lettre M:\ .
Il sera donc plus facile pour tout un chacun de communiquer l’endroit où se trouvent les documents recherché.
B. Network Location
Cette opération a des objectifs plus larges. D’abord, vous n’êtes plus limité par des lettres de lecteur. On peut même parler d’abonnements à une ressource plutôt que de connexion.
les types d’abonnements sont ici beaucoup plus variés: UNC, WebDav, FTP, ….
La ressources n’est ici plus liée à une lettre de lecteur mais se présente sous forme d’un raccourcis référençant l’URL de connexion native (ex: \\ServerA\Share, ftp://ServerA:21/, …)
Ce raccourci sera alors créé au niveau de l’explorateur Windows.
2. Network Location en détails
La constitution de cette ressource est un peu particulière. Ce n’est pas un simple pointeur ou simple raccourcis, mais plutôt une association entre un répertoire, un raccourci, un fichier de configuration , quelques ACL (droits NTFS) et le tout créer à un endroit spécial.
Vous l’aurez compris, les chipoteurs vont être servis
A. NetHood ou la localisation de tout
NetHood représente un répertoire spécial de windows qui stocke les raccourcis réseaux de type Network Location.
C:\Users\username\AppData\Roaming\Microsoft\Windows\Network Shortcuts
Pour plus d’information sur les autres répertoires réseaux: ICI
Le premier objectif est donc de pouvoir se positionner à cette endroit de manière dynamique.
En PowerShell, rien de plus facile On va commencer par instancier un objet COM de type Shell.Application
$shellApplication = New-Object -ComObject Shell.Application
Nous allons ensuite nous positionner à l’endroit voulu en nous aidant de la documentation MSDN référencée plus haut. La constante 0X13 représente le répertoire NetHood.
$nethoodPath = $shellApplication.Namespace(0x13).Self.Path
Voilà, nous y sommes
B. Création de la connection
Maintenant que nous sommes correctement positionné, nous allons réaliser 4 opérations pour créer une nouvelle connexion.
- Commençons par créer le répertoire qui va porter le nom de notre connexion:
$name = "Marketing on ServerB" $newLinkFolder = New-Item -Name $name -Path $nethoodPath -type directory
- Maintenant, nous allons créer un raccourcis dans ce répertoire qui va porter le nom Target.lnk et possédez toutes les propriétés requises.
Pour ce faire, nous allons instancier un object WScript.shell qui permet de manipuler les objets raccourcis de manières très simple
$shortcut = (New-Object -ComObject WScript.Shell).Createshortcut("$nethoodPath\$name\target.lnk") $shortcut.TargetPath = $targetPath $shortcut.IconLocation = "%SystemRoot%\system32\SHELL32.DLL, 85" $shortcut.Description = $targetPath $shortcut.WorkingDirectory = $targetPath $shortcut.Save()
-
Continuons par la création du fichier Desktop.ini nécessaire à l’interprétation par Windows de ce que nous réalisons. Il doit être placé dans le même répertoire que le fichier raccourcis (target.lnk):
$desktopIniContent = @" [.ShellClassInfo] CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D} Flags=2 ConfirmFileOp=1 "@ $desktopIniContent | Out-File -FilePath "$nethoodPath\$name\Desktop.ini"
-
Nous arrivons maintenant à la dernière étape qui est l’application des droits (ACL) sur les 2 fichiers et le répertoire les contenants:
Set-ItemProperty "$nethoodPath\$name\Desktop.ini" -Name Attributes -Value ([IO.FileAttributes]::System -bxor [IO.FileAttributes]::Hidden) Set-ItemProperty "$nethoodPath\$name" -Name Attributes -Value ([IO.FileAttributes]::ReadOnly)
Et voilà, le tour est joué
3. Exemple complet en PowerShell
<#***************** Arguments *****************#> #param ([String]$nodeName) param ([String]$name, [String]$TargetPATH) function Add-NetworkLocation { param( [string]$name, [string]$targetPath ) # Get the basepath for network locations $shellApplication = New-Object -ComObject Shell.Application $nethoodPath = $shellApplication.Namespace(0x13).Self.Path write-host $nethoodPath write-host "$nethoodPath\$name" Write-Host $targetPath # Only create if the local path doesn't already exist & remote path exists if ((Test-Path $nethoodPath) -and !(Test-Path "$nethoodPath\$name") -and (Test-Path $targetPath)) { # Create the folder $newLinkFolder = New-Item -Name $name -Path $nethoodPath -type directory # Create the ini file $desktopIniContent = @" [.ShellClassInfo] CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D} Flags=2 ConfirmFileOp=1 "@ $desktopIniContent | Out-File -FilePath "$nethoodPath\$name\Desktop.ini" # Create the shortcut file $shortcut = (New-Object -ComObject WScript.Shell).Createshortcut("$nethoodPath\$name\target.lnk") $shortcut.TargetPath = $targetPath $shortcut.IconLocation = "%SystemRoot%\system32\SHELL32.DLL, 85" $shortcut.Description = $targetPath $shortcut.WorkingDirectory = $targetPath $shortcut.Save() # Set attributes on the files & folders Set-ItemProperty "$nethoodPath\$name\Desktop.ini" -Name Attributes -Value ([IO.FileAttributes]::System -bxor [IO.FileAttributes]::Hidden) Set-ItemProperty "$nethoodPath\$name" -Name Attributes -Value ([IO.FileAttributes]::ReadOnly) } } $name $TargetPATH Add-NetworkLocation $name $TargetPATH
Source: http://social.technet.microsoft.com/Forums/en/ITCG/thread/fd34260e-ee4c-47c5-8c69-872a5239745f
La suite de cet article sera la traduction du code PowerShell en VB.Net.
Enjoy !!!
Badack
Leave a Reply