7 votes

Comment vérifier que PowerShell v2.0 est installé sur une liste de serveurs ?

Comment puis-je vérifier si PowerShell v2.0 est installé sur une liste de serveurs ? La liste de serveurs est une combinaison de Windows Server 2003 et Windows Server 2008. Un vbscript ou un PS script serait merveilleux.

Je sais que PowerShell est installé, par défaut, dans Windows Server 2008, mais j'aimerais m'assurer que personne n'a touché aux serveurs.

3voto

tony roth Points 3814

Je vérifierais cette clé HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\powershellversion.

0 votes

C'est exact. Cependant, avec tout le respect que je vous dois, je ne peux pas marquer cette réponse pour la seule raison que ma question était de vérifier plusieurs machines ou une liste de machines.

2voto

Nick Points 256

Après avoir creusé et trouvé plusieurs endroits qui ne menaient à rien d'utilisable dans mon environnement, j'ai pu trouver ceci. Cela fonctionnera sur des systèmes qui n'ont pas Powershell, donc cela pourrait être utilisé pour d'autres analyses de registre.

$hostA = “RemoteComputer”
$cred = Get-Credential "domain\username"
$RegPath = "SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine"
$ValueName = "PowerShellVersion"
$tmp = $(gwmi -computername $hostA -class win32_service -Credential $cred | Where-Object { $_.Name -eq “RemoteRegistry” })
if ( $($tmp.State) -eq "Stopped") {$tmp.StartService()}
$reg = Get-WmiObject -credential $Cred -List -Namespace root\default -computername $hosta | Where-Object {$_.Name -eq "StdRegProv"}
$ref = ($reg.GetStringValue(2147483650,$RegPath,$ValueName)).sValue
if ($ref -eq $null ) {Write-Host $hostA "doesn't have Powershell"} else {Write-Host $hostA "has Powershell version" $ref}

Edit : Après avoir cherché, il s'avère que cela ne fonctionne pas si le service de registre à distance n'est pas en cours d'exécution. J'ai ajouté du code pour vérifier le registre distant et le démarrer s'il est arrêté. Le site $cred = Get-Credential "domain\username" peut être supprimé ainsi que -Credential $cred en fonction de la configuration de votre domaine.

Edit2 : Ok, j'ai trouvé des problèmes de permission en utilisant .OpenSubKey(). Je le remplace par .GetValueKind(), puisque tout ce que nous devons faire est de vérifier que la clé existe. J'espère que cela fonctionnera pour vous. Je n'ai pas les permissions là où je travaille pour tester complètement ceci pour vous.

Edit3 : J'avais beaucoup de problèmes avec la permission dans mon environnement puisque je croise des domaines non fiables. J'ai réécrit le code ci-dessus pour qu'il fonctionne dans mon environnement. Il fonctionne à distance, et ne nécessite pas l'installation de Powershell. Faites-moi savoir si vous obtenez d'autres erreurs.

0 votes

J'ai d'abord testé sur mon PC. J'ai remplacé "RemoteComputer" par "FQDN de mon serveur", et il me dit que mon PC n'a pas PowerShell. Je ne suis pas sûr de la valeur de $ref et de son fonctionnement ici.

0 votes

Obtenez-vous d'autres erreurs ? Je suis dans un endroit où je peux vraiment le tester, et j'obtiens une erreur pour que $regKey soit défini correctement. Je vais me pencher sur la question et voir ce que je peux trouver.

0 votes

L'erreur est dite : Exception calling "GetValueKind" with "1" argument(s) : "La clé de registre spécifiée n'existe pas." À D:\Whiz\MyScripts\findPS1.ps1 :7 char:28 + $ref = $regKey.GetValueKind <<<< (" \SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShe llVersion") + CategoryInfo : NotSpecified : ( :) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException ... bien que ce script semble correct, il semble qu'il y ait quelque chose à propos de la façon dont il appelle le registre. J'essaie toujours de comprendre.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X