2017-02-23 12 views
2

複数のサーバーを検索して、特定のレジストリキーが存在するかどうかを確認しようとしています。Test-Path PowerShell問題

以下のコードが動作しているようですが、キーの最後の部分を追加すると、「見つけた」ものが停止します。私はa*を追加してからab*を最後のキーとして追加することができますが、3番目の文字になるか、それとも私が知っている完全な文字列になるとすぐに、見つからなかったという偽のメッセージが返されます。

$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

あなたは、リモートレジストリをチェックしていません。毎回コンピュータを所有しているだけです。ダブル*は冗長です。 – Matt

+0

*異なるコンピュータのレジストリパスをテストしようとしていますか?あなたの現在のコマンドはローカルコンピュータ上のレジストリをチェックするだけです。ファイルからパイプする各サーバの名前は –

+0

です。リモートレジストリの場合は、次のようにする必要があります。 '$ reg = [Microsoft.Win32.RegistryKey] :: OpenRemoteBaseKey(" Local Machine "、 $ _。machinename); $ key = $ reg.OpenSubkey($ keyname); $ value = $ key.GetValue( 'AutoAdminLogon') ' –

答えて

0

あなたはこのように、リモートレジストリをチェックすることができます。

だから、各サーバのためには、レジストリの値を取得し、それはArrayListの中で値を格納し、最終結果が表示されます。

現在、あなたのコードでは、基本的にはローカルでのみチェックしています。

​​

注:プレースホルダを変更してそれに応じて

+0

この方法では、値とマシン名の間の相関関係が失われます –

+0

次に、どのような方法が最適なのでしょうか。私に教えてください。 get-itempropertyまたはget-itempropertyvalueを使用したくありません。 –

+2

ArrayListを使用する代わりに、両方のプロパティ( '[pscustomobject]'タイプのアクセラレータまたは 'New-Object psobject'を使用)を使用してオブジェクトを出力し、 'foreach(){}'のループ全体が変数 –

1

あなたの問題は、各リモートサーバー名のローカルコンピュータに対するTest-Path実行することです。残念ながらTest-Pathは、リモートレジストリの照会をサポートしていません。

あなたは、WMIを使用することができます。

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

このようなあなたの計算プロパティで包み:

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