リモートPowershellセッションで資格情報を保持する方法は?


13

Azure File Shareがあり、cmdkeyでVMの資格情報を保持し、net useでマウントした後、Azure VMからこれを使用したいと思います。これは、Windows Server 2012 R2のローカルPowershellセッションでこれらのコマンドを実行することでテストされました。

ただし、この手順をAzure展開スクリプトに追加する必要があります。Azure Powershellスクリプトはラップトップから実行され、Azureサブスクリプションに接続し、多くの変数を使用してVMをゼロから構築します。

Invoke-Commandを使用して、Azure Powershellスクリプトから新しく作成されたVM上のリモートPowershellセッションに変数を渡すことができました。

$Session = New-PSSession -ConnectionUri $Uri -Credential $DomainCredential

$ScriptBlockContent = { 
Param ($Arg1,$Arg2,$Arg3)
cmdkey /add:$Arg1 /user:$Arg2 /pass:$Arg3}

Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)

そしてエラー:

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($Share,$AccountName,$Key)
CMDKEY: Credentials cannot be saved from this logon session.

構文を確認するためにcmdkey / listに置き換えられましたが、エラーはありません。

PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent
Currently stored credentials:
* NONE *

Windows Update PowerShellモジュール(Invoke-WUInstall)でも同様の問題があり(修正できませんでした)、VMのローカルPowershellセッションで正常に動作しますが、リモートPowershell経由で起動すると更新されません。

これを回避する方法はありますか?

回答:


2

Windowsが認証を処理する方法のため、リモートのPowerShellセッション経由でCMDKEYを使用して資格情報を設定することはできません。CMDKEYを使用する場合は、対話的に行う必要があります。

あなたに似た答えを探しているスレッドからドン・ジョーンズを引用するには:

これはCmdkeyコマンドの制限であり、実際にはPowerShellの問題ではありません。ただし、Remotigが資格情報を処理する方法に関連しています。リモートセッションは実際には資格情報を取得せず、委任チケットを取得するため、実際に保存するトークンはありません。これはすべて設計によるものであり、再構成できるものではありません。


2

スケジュールされたタスクを使用したくない場合は、SysinternalのPsExec.exeを使用できます。通常、PowerShellセッションを開始すると、cmdkeyに失敗するローカルユーザーの代わりに、servicesプロセスで実行されます(query sessionリモートコンピューターでコマンドを実行することで確認できます)。

これを克服するには、ローカルユーザーのプロセスでcmdkey.exeを実行する必要がありますPsExec.exe's -i

プログラムを実行して、リモートシステム上の指定されたセッションのデスクトップと対話します。セッションが指定されていない場合、プロセスはコンソールセッションで実行されます。

ここでの課題は、リモートマシン上のローカルユーザーのセッションIDを取得することです。query sessionこれは、マシンでアクティブなセッションのリストを表示するコマンドを実行することで実現しました。可能な解決策の1つは-

$processId = Invoke-Command $session -ScriptBlock  {
param($user)
    $sessions = query session $user;
    return $sessions[1].split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)[2];

} -ArgumentList ($user)

ここに$userは、リモートコンピューター上のローカルユーザーのユーザー名が含まれています。

セッションIDを取得したら、単に実行することができます

PsExec \\<computer_name> -u <local_user_name> -p <password> -h -i $processId cmdkey.exe /generic:testtt /user:userr /pass:pass

注意:

  1. リモートマシン上のユーザーのセッションIDを取得するより良い方法があります。
  2. 現在、PsExecの実行中に、回避できるリモートシステムとの接続を再度作成しています(テストしていません)。
  3. コマンドを実行するユーザーには、リモートマシンの管理者アクセスが必要です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.