如何在远程Powershell会话中保留凭据?


13

我有一个Azure文件共享,并且想在我的Azure VM中使用它-在使用cmdkey将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启动时不会更新。

有什么办法可以解决这个问题?

Answers:


2

由于Windows如何处理身份验证,因此无法使用CMDKEY通过远程PowerShell会话设置凭据,因此在使用CMDKEY时必须以交互方式进行。

引用线程中的Don Jones寻找与您相似的答案:

这是Cmdkey命令的局限性-并不是PowerShell真正的事情。但这与Remotig处理凭证的方式有关。远程会话实际上并没有获得凭证,而是得到了委托的票证,因此没有令牌可以实际保存。这些都是设计使然,而不是您可以重新配置的东西。


2

如果您不想使用计划任务,则可以使用Sysinternal的PsExec.exe。通常,启动PowerShell会话时,它将在services进程中运行(您可以通过query session在远程计算机上运行命令来确认此过程),而不是使cmdkey失败的本地用户。

为了克服这个问题,我们需要在本地用户的进程中运行cmdkey.exe,这可以通过使用以下PsExec.exe's -i标志来完成:

运行程序,使其与远程系统上指定会话的桌面进行交互。如果未指定会话,则该过程在控制台会话中运行。

现在,挑战在于获取远程计算机上本地用户的会话ID。我通过运行query session命令实现了这一点,该命令提供了机器上活动会话的列表。可能的解决方案之一是-

$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. 运行命令的用户应该在远程计算机上具有管理员访问权限。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.