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