在vista或win7以上版本提升bat脚本的执行权限

在vista或win7以上版本提升bat脚本的执行权限
http://hi.baidu.com/eternized/blog/item/1230c8c65d2392019c163da3.html

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值