Win7: Gérer les Network Locations en .Net et PowerShell (1/2)

avril 23, 2012
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:\).

MappedDrive

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.

Netloc

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 Sourire

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 facileSurpris 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 Sourire

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é Sourire 

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

It's only fair to share...Share on Facebook

Leave a Reply