【问题标题】:Is there a way to switch user in powershell to run a command without password prompt?有没有办法在powershell中切换用户以运行没有密码提示的命令?
【发布时间】:2019-11-22 14:22:38
【问题描述】:

我想使用 powershell 代码在远程机器上注销用户:

$session = ((quser /server:$system | Where-Object { $_ -match $user }) -split ' +')[2]
logoff $session /server:$system

目前这些命令由帐户执行:NT AUTHORITY\SYSTEM 但我想使用另一个用户执行这些命令。

我尝试过使用:

runas /user:administrator /savecred "quser /SERVER:$server"

但它提示输入密码,我想自动执行脚本。有什么方法可以切换用户而无需通过终端传递密码?

【问题讨论】:

  • 如果你能做到这一点,那将是一个重大的安全漏洞。任何恶意软件都可以做同样的事情,绕过为管理员提供适当的凭据。这有意义吗? 哎呀,让我们只允许在没有密码的情况下完成需要管理员权限的事情。这不会有什么问题,不是吗?
  • @KenWhite 完全同意你的看法。有什么方法可以传递凭据,从用户那里获取帐户名和密码,我相信我们不能将凭据直接传递到命令中,即 runas /user:administrator "quser /SERVER:$server" -Credential $Cred
  • 你试过使用Invoke-Command -Credential $(Import-Clixml $CredentialFilepath) -ScriptBlock {quser.exe} -ComputerName $server吗?
  • @GuentherSchmitz 我试过使用这个命令,它是从 NT AUTHORITY\SYSTEM 用户执行命令,而不是从输入的凭据。我已经使用“[System.Security.Principal.WindowsIdentity]::GetCurrent().Name”命令检查了用户,它仍然返回 NT AUTHORITY\SYSTEM 用户。

标签: powershell


【解决方案1】:

首先让我说,出于许多安全原因,这不是一个好主意,其中之一是如果有人可以访问您的脚本,它将可以访问您的密码。无论如何,您想要做的事情是不可能的,但您可以实施一种解决方法。

如果您知道密码,则可以“伪造”用户在提示中输入密码,而不是“运行没有密码提示的命令”,这不会抑制提示,而是会像有人实际输入密码一样写入密码键盘。

要实现这一点,您可以使用SendKeys 函数,它本质上是伪造按键。 这个想法是等待密码提示出现,然后一个字符一个字符地发送密码。

例如,这将发送密钥 Hi,然后按 enter,就像有人实际键入它们一样。

#Write some text
[System.Windows.Forms.SendKeys]::SendWait("Hi")
#Press on Enter
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")

不幸的是,我的知识到此结束,因为我从未真正成功使用过它,而是一直依赖手动输入。

【讨论】:

  • @KenWhite 从未说过这是一个聪明的想法,我只是说明了他如何能够实现他想要的。这就是为什么我写了“首先让我说,出于许多安全原因,这不是一个好主意,其中之一是如果有人可以访问您的脚本,它将可以访问您的密码”。没有必要居高临下...
  • @KenWhite 好吧,从我的看法来看,如果我们只写“不行,做不到”,他只会在其他地方搜索,直到找到它,不妨告诉他一个方法它并说它真的很不安全。只要他用它在家中登录他的 rpi,而不是在核发射代码系统中,如果他想冒险,我没问题。
  • 感谢@JohnSmith,我不会在脚本本身中硬编码密码,脚本可以使用 Export-Clixml 和 Import-Clixml 从安全文件中获取密码。我只想知道我们可以通过将凭据直接传递给命令来切换用户,例如使用 -Credential $Cred
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
相关资源
最近更新 更多