Comment travailler sur un serveur Core depuis un poste client, sans une interface de plateforme cloud et en sachant que ce poste client n'est pas dans un domaine (et que le serveur n'est pas un contrôleur).
Plusieurs façons de faire à ma connaissance (je rappelle que je ne suis pas un expert Windows du tout, même si j'adore rigoler avec PowerShell).
Nous allons essayer la 3)... vous allez voir, c'est pas triste du tout :-D...
Pour résumer ce qu'il conviendrait normalement de faire en situation réelle si vraiment on tenait à se servir de WinRM (ce qui n'est clairement pas la meilleure des idées...), voici un récapitulatif :
Set-PSSessionConfiguration -Name 'Microsoft.PowerShell' -ShowSecurityDescriptorUI
Ce que nous allons faire à présent est légèrement différent, puisque nous n'allons pas demander de faire certifier notre requête SSL auprès d'une autorité reconnue juste pour faire un test. Nous allons donc générer un certificat auto-signé sur le serveur Core et l'utiliser. La différence avec les étapes ci-dessous, c'est qu'il faudra également intégrer ce certificat au client.
Enfin, nous ne créerons pas l'utilisateur spécifique ni le groupe, nous allons rester très basique. L'idée ici, c'est juste de comprendre la mécanique et de voir comment on peut procéder au transfert de données entre les 2 protagonistes (du client au serveur core) de cette façon. Bien entendu, on peut aussi utiliser robocopy par ce biais.
(ou importez-en un signé si vous êtes dans ce contexte car ça évitera de devoir ajouter le certificat au magasin du client comme on le fera après).
D'abord, récupérer le nom de votre serveur :
$env:COMPUTERNAME
(on va prendre 'WIN-KAUMG9A63UJ' pour l'exemple)
New-SelfSignedCertificate -DnsName 'WIN-KAUMG9A63UJ' -CertStoreLocation 'Cert:\LocalMachine\My'
(L'empreinte thumbprint et le CN du serveur vont s'afficher.. Pratique, on pourra les copier/coller dans les commandes suivantes)
winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname='WIN-KAUMG9A63UJ'; CertificateThumbprint='9E095CBCCF54FCC93024ACB6725DB89D4819E334'}'
(il est preferrable de restreindre la surface de connexion au serveur à la seule adresse IP de votre client plutôt que d'ouvrir à tout le monde. Pour cela, nous allons écrire une règle de pare-feu pour restreindre à une seule adresse IP : 192.168.1.105 par exemple)
Voici le résultat qui confirme que cela a fonctionné :
ResourceCreated
Address = http://shcemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
ReferenceParameters
ResourceURI = http://schemas.microsoft.com/wbem/wsman/1/config/listener
SelectorSet
Selector: Address = *, Transport = HTTPS
New-NetFirewallRule -Name 'WinRM HTTPS' -DisplayName 'WinRM HTTPS' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 5986 -RemoteAddress 192.168.1.105
Ouvrir PowerShell en mode Administrateur
Add-Content -Path 'C:\Windows\System32\drivers\etc\hosts' -Value '`n192.168.1.44`tWIN-KAUMG9A63UJ'
(remplacez 192.168.1.44 et WIN-KAUMG9A63UJ par l'IP et le nom d'hôte du serveur, mais ne touchez pas à `n et `t)
New-Item -Path 'C:\TEMP' -ItemType Directory
Enter-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -UseSSL -Credential (Get-Credential) -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Vous devrez entrer l'identifiant/mot de passe d'un utilisateur du serveur autorisé à être contacté à distance et vous devez absolument placer les -SessionOption qui ne vérifient pas le certificat..
Autrement la connexion vous est refusée (pour l'instant, nous allons changer cela)
New-Item -Path 'C:\TEMP' -ItemType Directory
$CertPath = 'Cert:\LocalMachine\My'
$Cert = Get-ChildItem -Path $CertPath | Where-Object {$_.Subject -like '*CN=WIN-KAUMG9A63UJ*'}
Export-Certificate -Cert $Cert -FilePath C:\TEMP\server_certificate.cer
exit
$Session = New-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -Credential (Get-Credential) -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Copy-Item -Path 'C:\TEMP\server_certificate.cer' -Destination 'C:\TEMP\server_certificate.cer' -FromSession $Session
Import-Certificate -FilePath 'C:\TEMP\server_certificate.cer' -CertStoreLocation Cert:\LocalMachine\Root
Enter-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -UseSSL -Credential (Get-Credential)
(Je veux envoyer le dossier ISO qui se trouve sur le poste client de Marcel vers le serveur Windows Core, dans le dossier C:\TEMP)
$session = New-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -UseSSL -Credential (Get-Credential)
Copy-Item -Path 'C:\Users\Marcel\Documents\VM\ISO' -Destination 'C:\TEMP' -ToSession $session -Recurse
(vous avez l'exemple du certificat dans la procédure au-dessus, je la remets ici)
$Session = New-PSSession -ComputerName 'WIN-KAUMG9A63UJ' -Credential (Get-Credential) -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
Copy-Item -Path 'C:\TEMP\server_certificate.cer' -Destination 'C:\TEMP\server_certificate.cer' -FromSession $Session