New-SymbolicLink - Création d'un lien symbolique
Création — 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 : 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