none
リモートユーザ登録でps1で実行時のみSetInfo処理でエラー RRS feed

  • 質問

  • 管理サーバから各サーバに対し一括でユーザ登録を行うスクリプトを作成しているのですが、

    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


    2013年9月16日 19:33

回答

  • 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
    2013年9月17日 6:54
    モデレータ

すべての返信

  • 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
    2013年9月17日 6:54
    モデレータ
  • 無事リモートでユーザ作成を行うことが出来ました。

    早急なご回答ありがとうございます!!

    2013年9月17日 9:45