我正在尝试编写一个批处理文件,该文件需要使用本地管理员帐户运行一些命令(启动/停止服务)并使用登录用户运行一些命令(从用户目录复制文件),但遇到了问题。我尝试了以下命令:
使用 /savecred 运行
runas /user:(PC name)\(admin username) /savecred "net stop \"(service name)\""
runas /user:(PC name)\(admin username) /savecred "sc stop \"(service name)\""
使用时/savecred
不会提示我输入密码。相反,命令提示符窗口会短暂闪烁并消失。我无法分辨该窗口中的内容。服务未停止。
不使用 /savecred 的 runas
runas /user:(PC name)\(admin username) "net stop \"(service name)\""
runas /user:(PC name)\(admin username) "sc stop \"(service name)\""
这些命令确实提示我输入密码,但随后表现出与上述命令相同的行为 - 命令提示符窗口短暂弹出并且服务不会停止。
理想情况下,我希望保存会话的密码,因为我需要运行更多带有详细信息的命令。
这可能吗?如果可以,我做错了什么?
答案1
您可以将以下内容添加到脚本中,它将强制以提升权限运行。无需下载任何内容。
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:--------------------------------------
答案2
我将代码分成两部分
- 需要管理员权限。
重命名程序文件中安装的可执行文件
- 启动并终止该可执行文件的另一部分。
启动时将其提升,导致程序变得无用,因为它所依赖的其他东西没有提升
为需要提升权限的 bat 文件创建了一个快捷方式,并在其属性中选中了“以管理员身份运行”。在另一个文件中使用了快捷方式。
缺点
- 每个快捷方式都会打开一个新的 cmd 窗口
- 如果两个部分相互依赖,我认为需要做额外的工作
我竭尽全力,尽管在设置中禁用了自动启动,但可执行文件仍自动运行,msconfig 也将其服务设置为手动。这是我让它正常运行的最后努力。
答案3
将批处理文件分成两部分。将要以 admincmd 运行的部分粘贴到 system32。将要在普通 cmd 中运行的部分粘贴到常规文件夹中,然后从这里调用第二个批处理文件,该文件位于 system32 中。这样,第二部分始终在 admincmd 中运行。我试过了,它对我来说很有效。
答案4
“Runas”命令不会“sudo”您的命令。
要通过批处理文件执行此操作,您需要“提升”正在生成的命令。下载 Elevate Powertoy 脚本。
http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx
启动命令如下:
runas /user:(PC name)\(admin username) /savecred "elevate.cmd net stop \"(service name)\""
或者
runas /user:(PC name)\(admin username) /savecred "elevate sc stop \"(service name)\""