====== New-SymbolicLink - Création d'un lien symbolique ====== --- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2019/11/29 11:19// Créer un lien symbolique peut avoir plusieurs utilités. On peut par exemple réduire une arborescence ou regrouper dans un dossier des fichiers situés dans différents dossier. Pour cela, il existe la commande ''New-Item'' qui avec son parametre ''-ItemType SymbolicLink'' crée des lien symbolique. Cependant, cette commande à une limite. Elle ne peut pas créer des liens avec des éléments non accessibles naturellement par le système comme par exemple les ShadowCopy. La fonction suivante résout ce problème. * Référence : [[https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/new-item?view=powershell-6|Microsoft]] ===== Script ===== # Création de lien symbolique function New-SymbolicLink() { <# .SYNOPSIS Création d'un lien symbolique. .DESCRIPTION Permet de créer un lien symbolique entre un nom du lien et une cible de type fichier ou dossier, local, distant ou ShadowCopy. .PARAMETER Path Chemin du lien à créer. .PARAMETER Target Cible à lier lors de la création. .PARAMETER Type Type de lien. A choisir entre File et Directory. .EXAMPLE New-SymbolicLink -Path C:\hosts -Target C:\Windows\System32\drivers\etc\hosts -Type File Crée un lien symbolique du fichier 'C:\Windows\System32\drivers\etc\hosts', nommée 'hosts' et situé à la racine de C. .EXAMPLE New-SymbolicLink -Path C:\ShadowCopy -Target \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy50\ -Type Directory Crée un lien symbolique d'un ShadowCopy, sous la forme d'un dossier contenant l'intégralité de ses données. .INPUTS Pas de pipeline. Seulement les argumentss nommées. .OUTPUTS Création d'un lien symbolique. Affichage des informations sur le lien créé. .NOTES Crée par Nicolas THOREZ, Shyrka System .LINK https://www.shyrkasystem.com #> Param ( # Type de lien [Parameter(Mandatory = $true, ValueFromPipeline = $false)] [ValidateSet("File", "Directory")] [string]$Type, # Chemin du lien [Parameter(Mandatory = $true, ValueFromPipeline = $false)] [string]$Path, # Cible du lien [Parameter(Mandatory = $true, ValueFromPipeline = $false)] [string]$Target ) # Création du type d'objet [Custom.SymLink] Try { $Null = [Win32.SymLink] } Catch { Add-Type @" using System; using System.Runtime.InteropServices; namespace Win32 { public class SymLink { [DllImport("kernel32.dll")] public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags); } } "@ } # Numérisation du type If ($Type -eq 'File') { $Flag = 0 } Else { $Flag = 1 } # Création du lien [Win32.SymLink]::CreateSymbolicLink($Path, $Target, $Flag) # Traitement des éventuelles erreurs If ($?) { # Affichage du résultat New-Object PSObject -Property @{ SymLink = $Path Target = $Target Type = $Type } } Else { Write-Error "Erreur lors de la création du lien" } } ~~DISCUSSION~~