トップ回答者
リモートユーザ登録でps1で実行時のみSetInfo処理でエラー

質問
-
管理サーバから各サーバに対し一括でユーザ登録を行うスクリプトを作成しているのですが、
ps1ファイルにてSetInfo()コマンドを実行すると以下のエラーが発生してしまいます。
ソースをコピーしコマンド上から手動で実行したところ特に問題なくユーザ登録が行えました。
Enter-PSSessionは正常に完了している事は確認しました。
対策についてどなたかご教授いただけないでしょうか。
■環境
Windows server 2008 x86 (JPN)
Power Shell 2.0
■エラーメッセージ
"0" 個の引数を指定して "SetInfo" を呼び出し中に例外が発生しました: "エラーを特
定できません
"
発生場所 C:\bin\AddUser.ps1:64 文字:14
+ $user.SetInfo <<<< ()
+ CategoryInfo : NotSpecified: (:) []、MethodInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI■ソース
$strTmp = ""
# ----- Main Thread ----------------------------------------
# ■Variable declaration(変数宣言)
# ■Output Start Log(開始ログ出力)
funOutputLog("Start Addition User")
Write-host "Call to AddUser.ps1" #Debug
# ■情報の読み込み
$strTmp = $path + "Order_work"
$Order = Get-Content $strTmp
$arrOrderData = $Order.split(";")
#Write-host $Order #Debug
Write-host "登録日時[0]:" $arrOrderData[0] #Debug
Write-host "登録ユーザ[1]:" $arrOrderData[1] #Debug
Write-host "Order code[2]:" $arrOrderData[2] #Debug
Write-host "クライアント・サーバ[3]:" $arrOrderData[3] #Debug
Write-host "ユーザID[4]:" $arrOrderData[4] #Debug
Write-host "フルネーム[5]:" $arrOrderData[5] #Debug
Write-host "説明[6]:" $arrOrderData[6] #Debug
Write-host "権限[7]:" $arrOrderData[7] #Debug
#Write-host $arrOrderData[8] #Debug
#Write-host $arrOrderData[9] #Debug
#Write-host $arrOrderData[10] #Debug
#Write-host $arrOrderData[11] #Debug
#Write-host $arrOrderData[12] #Debug
# ■セッション確立
$sess = New-PSSession -computerName $arrOrderData[3]
Enter-PSSession $sess
Get-PSSession #Debug セッションの確認
# ■ユーザ追加
$computer = [ADSI]"WinNT://$arrOrderData[3]"
$StrTmp = [String]$arrOrderData[4]
$user = $computer.Create("user", $StrTmp)
$user.SetPassword("test#123456")
$user.SetInfo()
# ■セッション削除
exit-pssession
Remove-PSSession $sess
回答
-
Enter-PSSessionコマンドレットは、対象コンピュータに対しPSセッションを作成し、作成したPSセッション上で対話的にコマンド実行を開始するためのコマンドレットです。対話的実行のコマンドレットなのでスクリプト中で実行しても効果がありません。
ご提示のスクリプトのうち、Enter-PSSession以降のコードはすべて、リモートのPSセッション上で実行されているわけではなく、ローカルで実行されていることになります。
スクリプト中でリモートコンピュータに対しPSセッションを作成し、作成したPSセッションでコマンドを実行するには、New-PSSessionコマンドレットおよびInvoke-Commandコマンドレットを用います。
なお、PowerShell2.0ではInvoke-Commandコマンドレットでリモート実行するスクリプトブロックに、ローカル側の変数(今回の例では$arrOrderData)を渡すためのusingラベルが利用できないので、-ArgumentListパラメータを利用してスクリプトブロックに与えるパラメータとして指定する必要があります。
例としては以下のようなコードになるかと思います。
# ■セッション確立 $sess = New-PSSession -computerName $arrOrderData[3] Invoke-Command -Session $sess -ScriptBlock { param([string[]]$arrOrderData) # ■ユーザ追加 $computer = [ADSI]"WinNT://$arrOrderData[3]" $StrTmp = [String]$arrOrderData[4] $user = $computer.Create("user", $StrTmp) $user.SetPassword("test#123456") $user.SetInfo() } -ArgumentList (,$arrOrderData) # ■セッション削除 Remove-PSSession $sess
なお、-ArgumentListのパラメータ値に、「,$arrOlderData」のようにして「,」を付加しているのは、パラメータ値として配列値を渡すための記述となります。「,」を省略すると配列要素が展開され、それぞれが個別のスクリプトブロックのパラメータとしてバインドされるため、想定の動作になりません。
- 回答としてマーク nsi0423 2013年9月17日 9:45
すべての返信
-
Enter-PSSessionコマンドレットは、対象コンピュータに対しPSセッションを作成し、作成したPSセッション上で対話的にコマンド実行を開始するためのコマンドレットです。対話的実行のコマンドレットなのでスクリプト中で実行しても効果がありません。
ご提示のスクリプトのうち、Enter-PSSession以降のコードはすべて、リモートのPSセッション上で実行されているわけではなく、ローカルで実行されていることになります。
スクリプト中でリモートコンピュータに対しPSセッションを作成し、作成したPSセッションでコマンドを実行するには、New-PSSessionコマンドレットおよびInvoke-Commandコマンドレットを用います。
なお、PowerShell2.0ではInvoke-Commandコマンドレットでリモート実行するスクリプトブロックに、ローカル側の変数(今回の例では$arrOrderData)を渡すためのusingラベルが利用できないので、-ArgumentListパラメータを利用してスクリプトブロックに与えるパラメータとして指定する必要があります。
例としては以下のようなコードになるかと思います。
# ■セッション確立 $sess = New-PSSession -computerName $arrOrderData[3] Invoke-Command -Session $sess -ScriptBlock { param([string[]]$arrOrderData) # ■ユーザ追加 $computer = [ADSI]"WinNT://$arrOrderData[3]" $StrTmp = [String]$arrOrderData[4] $user = $computer.Create("user", $StrTmp) $user.SetPassword("test#123456") $user.SetInfo() } -ArgumentList (,$arrOrderData) # ■セッション削除 Remove-PSSession $sess
なお、-ArgumentListのパラメータ値に、「,$arrOlderData」のようにして「,」を付加しているのは、パラメータ値として配列値を渡すための記述となります。「,」を省略すると配列要素が展開され、それぞれが個別のスクリプトブロックのパラメータとしてバインドされるため、想定の動作になりません。
- 回答としてマーク nsi0423 2013年9月17日 9:45