2

レジストリ値について、.csv ファイルに保存されているマシンのリストをリモートでクエリするために、PowerShell のビットをまとめました。レジストリ キーの値が「1」に等しい場合、スクリプトは、マシンの名前をテキスト ファイルの名前として使用して、テキスト ファイルを作成する必要があります。

すべてがうまく機能します。スクリプトはエラーなしで問題なく実行されます。問題は、戻って対象のレジストリ値をリモートでチェックすると、値が 1 ではないことがわかります。スクリプトは、.csv のすべての行に対してファイルを作成しているだけです。

私は何を間違っていますか?

EDIT***レジストリ パスの $key 変数にタイプミスがある問題が見つかりました。2013 年 7 月 17 日 午後 2 時 21 分

$File = Import-Csv 'c:\temp\machines.csv'

foreach ($line in $file)
{
  $machinename = $line.machinename
  trap [Exception] {continue}
  $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",$MachineName)
  $key = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\WinLogon"
  $regkey = ""
  $regkey = $reg.opensubkey($key)
  $keyValue = ""
  $keyValue = $regKey.GetValue('AutoAdminLogon')

  if ($keyValue = "1")
  {
    try
    {
      $textFile = New-Item -Path "c:\temp\autologin" -Name $MachineName -ItemType "File"
    }
    catch
    {
      $msg = $_
      $msg
    }
  }
  $Results = $MachineName , $keyValue
  Write-host $Results

  #Output Below Here:
}
4

1 に答える 1

4

PowerShell=では、比較演算子ではなく代入演算子です。この行を変更します。

if ($keyValue = "1")

これに:

if ($keyValue -eq "1")

詳細については、 を参照してくださいGet-Help about_Operators

ところで、あなたはこの方法を複雑にしすぎています。次のようなもので十分です。

$keyname = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\WinLogon'

Import-Csv 'C:\temp\machines.csv' | % {
  $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachine",
           $_.machinename)
  $key = $reg.OpenSubkey($keyname)
  $value = $key.GetValue('AutoAdminLogon')
  if ($value -eq "1") {
    $filename = Join-Path "c:\temp\autologin" $_.machinename
    try {
      touch $filename
      $textFile = Get-Item $filename
    } catch {
      $_
    }
  }
  Write-Host ($_.machinename , $value)
}
于 2013-07-17T22:20:39.600 に答える