7.17更新
后来发现原来有更靠谱的写法。参考这个(https://sites.google.com/site/eneerge/home/BatchGotAdmin,要翻墙)
:: Get ADMIN Privs
:-------------------------------------
mkdir "%windir%\BatchGotAdmin"
if '%errorlevel%' == '0' (
rmdir "%windir%\BatchGotAdmin" & goto gotAdmin
) else ( goto UACPrompt )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/s /c " ^& """"%0"""" ^& " ", "", "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"
:-------------------------------------
:: End Get ADMIN Privs
: Your script begin here
===================================================================
刚刚写了一个bat脚本,需要修改到系统的核心文件。这原本倒没什么问题,在xp和我的win7下一切正常。但是在别的系统里面就狂“拒绝访问”。想了一下,这个微软的搞的权限管理的问题。一切都在于vista和win7有一个叫UAC的机制。(不懂看这里http://en.wikipedia.org/wiki/User_Account_Control)
要让脚本执行起来,也很简单。右键点击bat,选择“以管理员身份运行”,那就完事了。但是这样有一个缺点,就是假如用户不知道这样做才能使用呢?那你说简单,在执行脚本的时候提示一下就好了。但是这种要用户动脑筋看你说的文字,本身就不是一种具有良好用户体验的做法。最靠谱的做法,还是让执行脚本的时候,“直接”弹出那个UAC的提升权限窗口,让用户直接点“确定”那就好了。
原本,要实现这个效果是很简单的。在linux下,提升权限只需要直接su一下就搞定了。不过,在window下,似乎没法直接提升当前执行环境的权限。参考这篇blog(http://jagaroth.livejournal.com/63875.html),提供了一种曲线救国的办法:让bat脚本首先生成一个vb脚本,然后让这个vb脚本调用runas提升权限后,调用cmd来执行bat自身。下面是修改自上述blog的代码,使用时将自己的代码嵌到后面的代码块内。实验证明在win7home,xp下有效。
@echo off
REM Changing working folder back to current directory
%~d0
CD %~dp0
REM Folder changed
REM Check first if Windows XP
for /f "tokens=3*" %%i IN ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName ^| Find "ProductName"') DO set vers=%%i %%j
echo %vers% | find "XP" > nul
if %ERRORLEVEL% == 0 goto ver_xp
REM Ask for admin access
if exist "admincheckOK.txt" goto adminOK1
del /Q admincheckOK.vbs 2> nul
echo.Set objShell = CreateObject("Shell.Application") > admincheckOK.vbs
echo.Set FSO = CreateObject("Scripting.FileSystemObject") >> admincheckOK.vbs
echo.strPath = FSO.GetParentFolderName (WScript.ScriptFullName) >> admincheckOK.vbs
echo.If FSO.FileExists(%0) Then >> admincheckOK.vbs
echo. Dim oShell >> admincheckOK.vbs
echo. Set oShell = WScript.CreateObject ("WScript.Shell") >> admincheckOK.vbs
echo. oShell.run "cmd.exe /c echo admincheckOK > admincheckOK.txt" >> admincheckOK.vbs
echo. Set oShell = Nothing >> admincheckOK.vbs
echo. objShell.ShellExecute "cmd.exe", "/s /c " ^& """"%0"""" ^& " ", "", "runas", 1 >> admincheckOK.vbs
echo.Else >> admincheckOK.vbs
echo. MsgBox "Script file not found" >> admincheckOK.vbs
echo.End If >> admincheckOK.vbs
REM =========执行前的提示,非必需============
echo 一键XX
echo =========================
echo 此文件只需要运行一次,任意键后将可能需要你点一次权限确认。
pause
REM =========提示结束============
cscript //B admincheckOK.vbs
goto theend
:adminOK1
del /Q admincheckOK.txt 2> nul
del /Q admincheckOK.vbs 2> nul
:ver_xp
REM Admin Access allowed
REM ============原来的bat文件内容开始==========
echo 1
echo 2
echo 完成
REM ============内容结束======================
del /Q admincheckOK.vbs 2> nul
del /Q admincheckOK.txt 2> nul
:theend