如何在批处理中请求管理员权限



几周后,我修改IP地址的脚本就不起作用了。我怀疑是Windows 10的更新。

到目前为止,我一直在使用这个线程中给出的脚本:

@echo on
:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%SysWOW64cacls.exe" "%SYSTEMROOT%SysWOW64configsystem"
) ELSE (
>nul 2>&1 "%SYSTEMROOT%system32cacls.exe" "%SYSTEMROOT%system32configsystem"
)
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"
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%getadmin.vbs"
"%temp%getadmin.vbs"
del "%temp%getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
:--------------------------------------    
<YOUR BATCH SCRIPT HERE>

但现在,我得到了这个错误:

加载脚本失败:C:\Users\me\AppData\Local\Temp\getadmin.vbs:拒绝访问

奇怪的是,getadmin.vbs确实是在Temp目录中创建的。

以下是确切的输出:

C:UsersarcDesktopConfigLAN>REM --> Check for permissions
C:UsersarcDesktopConfigLAN>IF "AMD64" EQU "amd64" ("C:WINDOWSSysWOW64cacls.exe" "C:WINDOWSSysWOW64configsystem" 1>nul 2>&1 ) ELSE ("C:WINDOWSsystem32cacls.exe" "C:WINDOWSsystem32configsystem" 1>nul 2>&1 )
C:UsersarcDesktopConfigLAN>REM --> If error flag set, we do not have admin.
C:UsersarcDesktopConfigLAN>if '5' NEQ '0' ( echo Requesting administrative privileges... goto UACPrompt ) else (goto gotAdmin ) Requesting administrative privileges...
C:UsersarcDesktopConfigLAN>echo Set UAC = CreateObject("Shell.Application") 1>"C:UsersarcAppDataLocalTempgetadmin.vbs"
C:UsersarcDesktopConfigLAN>set params=
C:UsersarcDesktopConfigLAN>echo UAC.ShellExecute "cmd.exe", "/c ""C:UsersarcDesktopCONFIG~1newBatch.bat"" ", "", "runas", 1 1>>"C:UsersarcAppDataLocalTempgetadmin.vbs"
C:UsersarcDesktopConfigLAN>"C:UsersarcAppDataLocalTempgetadmin.vbs"
(error is triggered here)
C:UsersarcDesktopConfigLAN>del "C:UsersarcAppDataLocalTempgetadmin.vbs"
C:UsersarcDesktopConfigLAN>exit /B

您可以使用以下序列,它对我来说非常好。

@echo off
::::::::::::::::::::::::::::::::::::::::::::
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' (goto gotPrivileges) else (goto getPrivileges)
:getPrivileges
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%getadmin.vbs"
echo For Each strArg in WScript.Arguments >> "%temp%getadmin.vbs"
echo If strArg = WScript.Arguments.Item^(0^) Then d = Left^(strArg, InStrRev^(strArg,""^) - 1^) >> "%temp%getadmin.vbs"
echo args = args ^& " " ^& strArg  >> "%temp%getadmin.vbs"
echo Next >> "%temp%getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", ^("/c start /D """ ^& d ^& """ /B" ^& args ^& " ^& exit"^), , "runas", 4 >> "%temp%getadmin.vbs"
cscript "%temp%getadmin.vbs" ""%~s0"" %*
del /q "%temp%getadmin.vbs"
exit /b
:gotPrivileges
:: Your code here

这个VBS脚本完美地使用了UAC.ShellExecute,您可以自己指出更改。你使用了很多技巧,VBS代码甚至没有以正确的方式调用UAC,这就是为什么它拒绝授予权限的原因。我相信cacls和这个脚本的使用在过去非常有用,恶意软件在未经用户许可的情况下使用它来获得管理访问权限,有很多程序为此使用了icacls,我甚至不会指出,但这可能会使使用icacls变得困难。

你也可以使用Powershell以前做这件事。

Powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/c C:YourPathyourprogram.bat'"

这两个脚本对我来说都很好。我可以在你的.vbs中看到很多错误,但指出它们没有意义,因为脚本不是你的。我建议你使用Powershell,它更有用,更简单,可以集成:

NET FILE >NUL 1>NUL 2>NUL
if %errorlevel% equ 0 (goto gotprivileges) else (start Powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/c C:YourPathyourprogram.bat'" & exit)

希望这能有所帮助,
K

最新更新