J’ai cherché un moyen d’envoyer des paquets WOL sous Windows, en tant que devoir. Ce que j’ai trouvé comme solution1 me semble être un bon moyen d’initier quelqu’un à powershell.
Ce que je trouve utile en fait, c’est le fait que, comme sous Linux, il est possible de créer un fichier de configuration utilisateur, qui conserve au redémarrage des fonctions, des alias et des commandes personnalisées pour votre terminal.
$PROFILE
Pour accéder à votre fichier personnalisé, vous pouvez simplement exécuter le bloc-notes en powershell :
notepad $PROFILE
Ou vous pouvez tester si votre $PROFILE existe :
test-path $profile
Et exécutez ceci:
New-Item -Path $profile -Type File -Force
Si vous n’avez jamais utilisé PowerShell, pour faire fonctionner votre profil, vous devrez configurer la politique d’exécution.
Get-ExecutionPolicy
# Set the ExecutionPolicy to RemoteSigned:
Set-ExecutionPolicy RemoteSigned
Vous pouvez également utiliser “l’environnement de script intégré” powershell ISE pour modifier votre fichier $PRIOFILE. ISE est un outil puissant qui a l’auto-complétion activée par défaut et toutes les fonctions PowerShell chargées au moment où vous commencez à taper.
ise $PROFILE
Alors, pourquoi est-ce important? Eh bien, pour avoir un réveil sur LAN, nous devons utiliser une fonction, une fonction peut faire partie d’un script ou peut être insérée dans votre fichier de profil et être utilisée comme fonction de terminal. De cette façon, vous pouvez l’appeler comme vous le feriez pour un programme ou une applet.
WOL function
function Invoke-WakeOnLan
{
param
(
# one or more MACAddresses
[Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]
# mac address must be a following this regex pattern:
[ValidatePattern('^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$')]
[string[]]
$MacAddress
)
begin
{
# instantiate a UDP client:
$UDPclient = [System.Net.Sockets.UdpClient]::new()
}
process
{
foreach($_ in $MacAddress)
{
try {
$currentMacAddress = $_
# get byte array from mac address:
$mac = $currentMacAddress -split '[:-]' |
# convert the hex number into byte:
ForEach-Object {
[System.Convert]::ToByte($_, 16)
}
#region compose the "magic packet"
# create a byte array with 102 bytes initialized to 255 each:
$packet = [byte[]](,0xFF * 102)
# leave the first 6 bytes untouched, and
# repeat the target mac address bytes in bytes 7 through 102:
6..101 | Foreach-Object {
# $_ is indexing in the byte array,
# $_ % 6 produces repeating indices between 0 and 5
# (modulo operator)
$packet[$_] = $mac[($_ % 6)]
}
#endregion
# connect to port 400 on broadcast address:
$UDPclient.Connect(([System.Net.IPAddress]::Broadcast),4000)
# send the magic packet to the broadcast address:
$null = $UDPclient.Send($packet, $packet.Length)
Write-Verbose "sent magic packet to $currentMacAddress..."
}
catch
{
Write-Warning "Unable to send ${mac}: $_"
}
}
}
end
{
# release the UDF client and free its memory:
$UDPclient.Close()
$UDPclient.Dispose()
}
}
Afin de le rendre vraiment simple, vous pouvez également créer un alias pour cette fonction comme suit :
Alias
Set-Alias wake Invoke-WakeOnLan
(Si vous avez déjà trouvé un peu énervant, le processus de copie de vos clés ssh.)2
ssh-copy-id
En bonus, voici une fonction bien connue de Linux implémentée en tant que fonction PowerShell3 :
function Set-CopySSH
{
param (
[Parameter()]
[string]$Address
)
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh $Address "cat >>
.ssh/authorized_keys"
}
Et créez un simple alias :
Set-Alias copy-ssh Set-CopySSH