3

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

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

在 Linux 中,等效的成语是:

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

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

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

4

3 回答 3

7

这是另一种选择:

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

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

有一种方法可以调用runasvbscript 并让 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,但我认为这可能会从重新启动后登录的第一个用户启动它。

于 2013-02-14T00:49:42.600 回答
0

试试这个runas命令。

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

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

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

于 2013-02-13T20:26:39.517 回答
-1

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

于 2013-02-13T20:34:14.587 回答