Wie können wir überprüfen, ob PowerShell v2.0 auf einer Liste von Servern installiert ist?

7

Wie kann ich überprüfen, ob PowerShell v2.0 auf einer Liste von Servern installiert ist? Die Liste der Server ist eine Kombination aus Windows Server 2003 und Windows Server 2008. Ein vbscript- oder PS-Skript wäre wunderbar.

Ich weiß, dass PowerShell standardmäßig in Windows Server 2008 installiert ist, obwohl ich nur sicherstellen möchte, dass niemand mit den Servern herumspielt.

Whizkid
quelle

Antworten:

2

Nachdem ich mich umgesehen und mehrere Orte gefunden hatte, die dazu führten, dass in meiner Umgebung nichts brauchbares war, konnte ich dies finden. Dies funktioniert auf Systemen ohne Powershell, sodass es für andere Registrierungsscans verwendet werden kann.

$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}

Bearbeiten: Nachdem Sie sich umgesehen haben, stellt sich heraus, dass dies nicht funktioniert, wenn der Remote-Registrierungsdienst nicht ausgeführt wird. Ich habe Code hinzugefügt, um nach Remote-Registrierung zu suchen und zu starten, wenn gestoppt. Das $cred = Get-Credential "domain\username"kann zusammen mit -Credential $credabhängig von Ihrem Domain-Setup entfernt werden.

Edit2: Ok, ich habe Berechtigungsprobleme bei der Verwendung von .OpenSubKey () gefunden. Ich wechsle es zu .GetValueKind (), da wir nur überprüfen müssen, ob der Schlüssel vorhanden ist. Hoffentlich funktioniert das für Sie. Ich habe nicht die Berechtigungen, mit denen ich arbeite, um dies für Sie vollständig zu testen.

Edit3: Ich hatte viele Probleme mit der Berechtigung in meiner Umgebung, da ich nicht vertrauenswürdige Domänen überquere. Ich habe den obigen Code neu geschrieben, um in meiner Umgebung zu funktionieren. Es funktioniert remote und erfordert keine Installation von Powershell. Lassen Sie mich wissen, wenn Sie weitere Fehler erhalten.

Nick
quelle
Ich habe zuerst auf meinem PC getestet. Ich habe "RemoteComputer" durch "FQDN meines Servers" ersetzt und es wird mir mitgeteilt, dass mein PC nicht über PowerShell verfügt. Ich bin nicht sicher, was der Wert von $ ref ist und wie es hier funktioniert.
Whizkid
Erhalten Sie weitere Fehler? Ich bin an einem Ort, an dem ich es tatsächlich testen kann, und es wird eine Fehlermeldung angezeigt, dass $ regKey richtig eingestellt wird. Ich werde es mir ansehen und sehen, was ich finden kann.
Nick
Fehler sagt: Ausnahme beim Aufruf von "GetValueKind" mit "1" Argument (en): "Der angegebene Registrierungsschlüssel existiert nicht." Unter D: \ Whiz \ MyScripts \ findPS1.ps1: 7 char: 28 + $ ref = $ regKey.GetValueKind <<<< ("\ SOFTWARE \ Microsoft \ PowerShell \ 1 \ PowerShellEngine \ PowerShellVersion") + CategoryInfo: NotSpecified: ( :) [], MethodInvocationException + FullyQualifiedErrorId: DotNetMethodException ... obwohl dieses Skript in Ordnung aussieht, sieht es nach der Art und Weise aus, wie es die Registrierung aufruft. Ich versuche immer noch, das herauszufinden.
Whizkid
Ich kann momentan nichts testen, aber wenn ich am Montag wieder zur Arbeit komme, werde ich sehen, ob ich herausfinden kann, was falsch läuft.
Nick
Ich habe das Skript oben repariert. Es funktioniert in meiner Umgebung. Hoffentlich löst dies Ihr Problem.
Nick
3

Ich würde diesen Schlüssel HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ PowerShellEngine \ Powershellversion überprüfen.

Tony Roth
quelle
Das ist richtig. Bei allem Respekt kann ich dies jedoch nicht als Antwort markieren, da meine Anfrage nur darin bestand, mehrere / Liste von Maschinen zu überprüfen.
Whizkid