2017-02-23 4 views
2

Ich versuche, mehrere Server zu suchen, um festzustellen, ob ein bestimmter Registrierungsschlüssel vorhanden ist.Test-Path PowerShell Problem

Es sieht aus wie der Code unten funktioniert, aber als ich fange, den letzten Teil des Schlüssels hinzuzufügen, hört es auf, "Sachen" zu finden. Ich kann anfangen, a*, dann ab* als der letzte Schlüssel hinzuzufügen, aber sobald ich zum dritten Zeichen oder sogar der vollen Schnur komme, die ich weiß, ist dort, kommt es zurück Falsch, sagend, dass es es nicht gefunden hat.

$servers = Get-Content c:\input.txt | ` 
    Select-Object @{l='ComputerName';e={$_}},@{l='KeyExist';e={Test-Path "HKLM:\System\CurrentControlSet\services\*abcdefg*" }} 
$servers | Format-Table -AutoSize 
+0

Sie sind nicht Remote-Register überprüfen. Nur Sie besitzen jedes Mal Computer. Die Doppel * sind überflüssig. – Matt

+0

Möchten Sie möglicherweise den Registrierungspfad auf * verschiedenen * Computern testen? Ihr aktueller Befehl überprüft nur die Registrierung auf Ihrem lokalen Computer, und zwar für jeden Servernamen, den Sie aus der Datei –

+0

eingeben. Für die Remote-Registrierung sollten Sie Folgendes tun: '$ reg = [Microsoft.Win32.RegistryKey] :: OpenRemoteBaseKey (" LocalMachine ", $ _. Maschinename); $ Schlüssel = $ reg.OpenSubkey ($ Schlüsselname); $ value = $ key.GetValue ('AutoAdminLogon') ' –

Antwort

0

Sie können die Remote-Registrierung wie folgt überprüfen:

für jeden Server So wird es den Registrierungswert erhalten, und es wird den Wert in der Arraylist speichern und wird das Endergebnis angezeigt werden soll.

Derzeit in Ihrem Code überprüfen Sie grundsätzlich nur lokal.

#####Get Registry Value #### 
$main = "LocalMachine" 
$path= "registry key path" 
$servers = Get-Content c:\input.txt #-- Get all the servers 
$arr=New-Object System.Collections.ArrayList 

foreach ($Server in $servers) 
{ 

$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($main, $Server) 
$regKey= $reg.OpenSubKey($path) 
$Value = $regkey.GetValue($key) 
$arr.Add($Value) 
} 
$arr 

Hinweis: die Platzhalter ändern entsprechend

+0

Mit diesem Ansatz verlieren Sie die Korrelation zwischen Wert und Maschinenname –

+0

Dann was sollte der beste Weg sein. Könntest du mich bitte wissen lassen. Ich möchte nicht get-itemproperty oder get-itempropertyvalue verwenden –

+2

Anstatt eine ArrayList zu verwenden, sollten Sie ein Objekt mit beiden Eigenschaften (mit dem '[pscustomobject] -Typ-Accelerator oder' New-Object psobject') ausgeben und dann zuweisen die gesamte 'foreach() {} 'Schleife zu einer Variablen –

1

Ihr Problem ist, dass Sie Test-Path gegen den lokalen Computer für jeden Remote-Server-Namen laufen. Leider unterstützt Test-Path nicht Abfragen von Remote-Registrys.

könnten Sie WMI verwenden:

$RegProv = [wmiclass]"\\$servername\root\default:StdRegProv" 
if($RegProv.EnumKey(2147483650,"System\CurrentControlSet\services").sNames -like 'abc*'){ 
    # key starting with abc exists 
} 

es so in Ihrer berechneten Eigenschaft Wrap:

@{Name='KeyExists';Expression={[bool](([wmiclass]"\\$_\root\default:StdRegProv").EnumKey(2147483650,"System\CurrentControlSet\services").sNames -like 'abc*')}} 
Verwandte Themen