I am trying to write a batch file for my users to run from their Vista machines with UAC. The file is re-writing their hosts file, so it needs to be run with Administrator permissions. I need to be able to send them an email with a link to the .bat file. The desired behavior is that when they right-click on the file and say Open, they will get one of those UAC dialogs that makes the screen go dark and forces them to answer whether they want to give the application permission to run as administrator. Instead, they are just seeing "Access denied" on the command line window.

有可能采取不同的做法吗?


当前回答

@echo off和title可以放在下面代码之前:

net session>nul 2>&1
if %errorlevel%==0 goto main
echo CreateObject("Shell.Application").ShellExecute "%~f0", "", "", "runas">"%temp%/elevate.vbs"
"%temp%/elevate.vbs"
del "%temp%/elevate.vbs"
exit

:main
    <code goes here>
exit

如果你不需要担心以下问题,那么很多其他答案都是多余的:

参数 工作目录(cd %~dp0将更改为包含批处理文件的目录)

其他回答

这个脚本很有用!只需将其粘贴到bat文件的顶部。如果您想查看脚本的输出,请在批处理文件的底部添加“pause”命令。

更新:这个脚本现在稍微编辑了一下,以支持命令行参数和64位操作系统。

感谢能源@ https://sites.google.com/site/eneerge/scripts/batchgotadmin

@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
    IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>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"
    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>

你不能从批处理文件中请求管理权限,但是你可以在%temp%中编写一个windows脚本主机脚本并运行它(它反过来以管理员身份执行你的批处理)。使用“runas”作为动词的应用程序对象

由于我在这个脚本弹出一个新的命令提示符并在无限循环中再次运行时遇到了麻烦(使用Win 7 Pro),我建议您尝试另一种方法:我如何自动提升我的批处理文件,以便它在需要时请求UAC管理员权限?

小心,你必须在脚本的末尾添加这个,就像在编辑中说的那样,这样你就可以在权限提升后回到脚本目录: CD /d %~dp0

@echo off和title可以放在下面代码之前:

net session>nul 2>&1
if %errorlevel%==0 goto main
echo CreateObject("Shell.Application").ShellExecute "%~f0", "", "", "runas">"%temp%/elevate.vbs"
"%temp%/elevate.vbs"
del "%temp%/elevate.vbs"
exit

:main
    <code goes here>
exit

如果你不需要担心以下问题,那么很多其他答案都是多余的:

参数 工作目录(cd %~dp0将更改为包含批处理文件的目录)

我知道这不是OP的解决方案,但是因为我确信这里还有许多其他用例,所以我想分享一下。

我对这些答案中的所有代码示例都有问题,但后来我发现: http://www.robotronic.de/runasspcEn.html

它不仅允许您以管理员身份运行,还可以检查文件以确保它没有被篡改,并安全地存储所需的信息。我承认它不是最明显的工具,但对于我们这些编写代码的人来说,它应该足够简单。