批处理中有部分命令需要管理员身份才能执行,我不想用户等到命令执行失败,被告知需要管理员身份时才想起要以管理员身份运行,那样会浪费很多时间。
我希望能够有办法检测批处理是否以管理员身份运行,从而在第一时间就告知用户。 又或者批处理一被执行的时候,就立即向用户请求管理员权限,从而解决这个问题。
求各位高手帮忙想想办法,或者是提供一些这方面的资料
runas 直接调用管理员执行... 省去提示信息 如何...
runas 需要一个具有管理员权限的账号比如administrator,可是一般用户这个帐号默认都是禁用的,而且runas还需要提示输入账户密码,更闹心了。
lz这个要求依靠批处理在普通账户下执行,实现起来基本无望,连大名鼎鼎的process explorer在普通账户下如果不右键提权,获取信息都不全。
这个可以尝试一下用NirCMD命令行工具(可到nirsoft.net搜索下载)实现。即在bat中需要以管理员身份才能执行的每个命令行前加入nircmd的以管理员权限启动的命令,命令格式: NirCMD.exe elevate 程序.exe 参数
需要注意的是,NirCMD的elevate命令仅在win7和2008下有效。
办法1 写入文件法 向System32文件夹写入临时文件,若能写入成功,则说明批处理具有管理员权限,否则说明不具有。 代码如下: @ECHO OFF Rem 创建文件路径 set TempFile_Name=%SystemRoot%\System32\BatTestUACin_SysRt%Random%.batemp echo %TempFile_Name% Rem 写入文件 ( echo "BAT Test UAC in Temp" >%TempFile_Name% ) 1>nul 2>nul Rem 判断写入是否成功 if exist %TempFile_Name% ( echo 正在以管理员身份运行当前批处理 ) else ( echo 没有以管理员身份运行当前批处理 ) pause Rem 删除临时文件 del %TempFile_Name% 1>nul 2>nul echo 按空格键退出…… pause >nul
方法2 窗口标题判断法 以管理员身份运行的批处理,设置标题后,标题前方会提示 "管理员: " ,可判断特定窗口标题所对应的进程名是否为cmd.exe 来确认批处理是否以管理员身份运行。代码如下: @echo off title BAT setlocal EnableDELAYEDEXPANSION Rem 设置标志变量 set UAC=0 Rem 获取tasklist命令输出 For /f "usebackq delims==" %%i In (`tasklist /fi "WINDOWTITLE eq 管理员: BAT"`) Do ( set "cmdline=%%i" set "cmdline=!cmdline:~0,7!" if "!cmdline!" == "cmd.exe" ( set UAC=1 ) ) if "%UAC%" == "1" ( echo 正在以管理员身份运行当前批处理 ) else ( echo 没有以管理员身份运行当前批处理 ) :End pause exit
|