【问题标题】:Is it possible to run a command headlessly (in a bat script) as another user on Windows?是否可以在 Windows 上作为另一个用户无头运行命令(在 bat 脚本中)?
【发布时间】:2013-02-13 20:12:34
【问题描述】:

我想让 .bat 脚本以不同的用户身份执行特定任务并无头运行(不允许用户输入或提示)。有没有办法用 .bat 脚本做到这一点?请注意,我不能使用 PowerShell,因为默认情况下它没有安装在我们必须支持的所有 Windows 操作系统上。

我在脚本中考虑了 RUNAS,但它显然需要交互式输入。

在 Linux 中,等价的成语是:

echo "Password" | sudo -S -u username "command"

对 Windows .bat 脚本有什么建议吗?

更新:我相信 vbscript 在 Windows 上始终可用,所以如果可以通过 vbscript 获得纯粹的无头解决方案,那也很好!

【问题讨论】:

    标签: batch-file vbscript cmd


    【解决方案1】:

    这是另一种选择:

    wmic /user:username /password:pass process call create "cmd /c \"d:\\path\\to\\program.exe\" /arg etc"
    

    编辑:显然这不允许在本地机器上使用单独的凭据进行身份验证。

    有一种方法可以使用 vbscript 调用 runas 并让 vbscript 将密码发送到控制台以自动输入密码。

    set WshShell = WScript.CreateObject("Wscript.Shell")
    WshShell.run "runas /noprofile /user:USERNAME " + Chr(34) + "d:\path\to\command.exe /args" + Chr(34)
    WScript.Sleep 500
    WshShell.SendKeys "PASSWORD"
    WshShell.SendKeys "{ENTER}"
    set WshShell = nothing
    

    将其保存到.vbs 文件并通过cscript /nologo script.vbs 调用它

    如果您需要从批处理脚本运行,只需做一些创造性的回应。

    @echo off
    setlocal
    
    set username=username
    set password=password
    set program=d:\path\to\program.exe /arg argument
    
    echo set WshShell = WScript.CreateObject(^"Wscript.Shell^")>runas.vbs
    echo WshShell.run ^"runas /netonly /noprofile /user:%username% ^" + Chr(34) + ^"%program%^" + Chr(34)>>runas.vbs
    echo WScript.Sleep 500>>runas.vbs
    echo WshShell.SendKeys ^"%password%^">>runas.vbs
    echo WshShell.SendKeys ^"{ENTER}^">>runas.vbs
    echo set WshShell = nothing>>runas.vbs
    cscript /nologo runas.vbs
    del /q runas.vbs
    

    如果这对您不起作用,您还可以使用 psexec 运行具有不同凭据的程序。

    psexec -u USERNAME -p PASSWORD d:\path\to\command.exe
    

    我能想到的唯一其他选择是通过组策略启动脚本运行您的脚本,该脚本将从系统帐户执行脚本。我也考虑过从注册表的HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce 调用它,但我认为这可能会从重启后第一个登录的用户启动它。

    【讨论】:

    • 似乎 WMI 引擎不允许您使用凭据进行本地连接。执行上述操作会导致错误消息:User credentials cannot be used for local connections 有没有办法解决这个问题?
    • 您可以尝试添加/node 参数。 wmic /node:computername /user:adminuser /password:password process call create "cmd /c \"d:\\path\\program.exe\"" 编辑:不,这也不起作用。让我玩一下,看看我能想出什么。
    • 我只是尝试添加 /node 并尝试了计算机名的完全限定主机名和短主机名,但我仍然收到上面相同的错误消息。谢谢你的想法......还有什么我可以尝试的吗?刚刚看到您的编辑...无论发生什么都感谢您!
    • 您提供了多种适合该问题的解决方案,这非常好,也是对您的技能的致敬!问题已回答!非常感谢!
    【解决方案2】:

    试试runas 命令。

    runas /user:"DOMAIN\user" "C:\Program Files\path\to\program.exe" /savecred
    

    您可以使用/savecred 保存凭据,而不必再次输入。

    http://technet.microsoft.com/en-us/library/cc771525.aspx

    【讨论】:

    • 我遇到的问题是这是一些安装代码的一部分(出于内部开发目的,我们将用户名/密码放入脚本中)。安装代码的任何部分都无法访问用户输入,因此永远没有机会提前保存凭据,因为整个脚本都是无头运行的。正如我在最初的问题中提到的,我们已经考虑了 RUNAS,但它不是作为问题一部分的约束的有效选择。也许这个问题的答案是没有办法在 .bat 脚本中做到这一点。
    【解决方案3】:

    runas 是正确的方法。在您第一次运行批处理时添加/username user /savecred,它将询问用户密码并保存,以便下次使用保存的凭据运行

    【讨论】:

    • 不幸的是,这个问题完全不需要交互式输入,即使只完成一次。
    猜你喜欢
    • 2022-10-19
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2018-01-30
    相关资源
    最近更新 更多