如何检测当前批处理是否以管理员身份运行?

DeepBlueTears 2011-08-12 04:47:57
现在我遇到了一个问题:批处理中有部分命令需要管理员身份才能执行,我不想用户等到命令执行失败,被告知需要管理员身份时才想起要以管理员身份运行,那样会浪费很多时间。

我希望能够有办法检测批处理是否以管理员身份运行,从而在第一时间就告知用户。
又或者批处理一被执行的时候,就立即向用户请求管理员权限,从而解决这个问题。

求各位高手帮忙想想办法,或者是提供一些这方面的资料,谢谢。

...全文
5365 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
liquan_1974 2014-01-05
  • 打赏
  • 举报
回复
fsutil>nul if errorlevel 1 (请关闭此窗口,使用上下文菜单(鼠标右键)选择“以管理员身份运行”) cd /d %~dp0
monyxie 2011-11-17
  • 打赏
  • 举报
回复

set uac=0
bcdedit>nul
if errorlevel 1 set uac=1
januchan 2011-08-15
  • 打赏
  • 举报
回复
倒不如直接使用 administrator 用户登录。
zara 2011-08-15
  • 打赏
  • 举报
回复
这个东西,没这么复杂吧?net user %username% 不是可以显示当前用户的属性吗,最后就有隶属组别信息的,通过过滤提取看其中是否有 administrators 就可以判断出是否管理员身份了。不过,我对批处理这方面也不熟悉,楼主可以到 xp板块 去看看,那里有批处理高手。
DeepBlueTears 2011-08-15
  • 打赏
  • 举报
回复
感谢各位的帮助。虽然还是没有找到好的办法来请求管理员权限,但是已经找到了测试当前批处理是否具有管理员权限的办法。

办法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



此方法需要外部命令 tasklist.exe 支持才能成功。
zara 2011-08-15
  • 打赏
  • 举报
回复
以其他用户运行你的批处理时,批处理获得的当前用户信息,不是你现在的这个当前用户,而是批处理运行时的那个当前用户,即批处理运行时的用户。
DeepBlueTears 2011-08-15
  • 打赏
  • 举报
回复

当前用户是管理员 ≠> 程序以管理员身份运行
程序以管理员身份运行 => 当前用户是管理员 (忽略利用系统漏洞提权等等……)
DeepBlueTears 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zara 的回复:]
这个东西,没这么复杂吧?net user %username% 不是可以显示当前用户的属性吗,最后就有隶属组别信息的,通过过滤提取看其中是否有 administrators 就可以判断出是否管理员身份了。不过,我对批处理这方面也不熟悉,楼主可以到 xp板块 去看看,那里有批处理高手。
[/Quote]
完全不是“用户是不是管理员”的问题,即使当前用户是管理员,他不以管理员身份运行批处理程序,批处理程序照样没有管理员权限。
sxyengene 2011-08-14
  • 打赏
  • 举报
回复
右键看看属性怎么样
DeepBlueTears 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 forever_young 的回复:]
引用 2 楼 struggle1 的回复:
runas 直接调用管理员执行... 省去提示信息 如何...


runas 需要一个具有管理员权限的账号比如administrator,可是一般用户这个帐号默认都是禁用的,而且runas还需要提示输入账户密码,更闹心了。

lz这个要求依靠批处理在普通账户下执行,实现起来基本无望,连大名鼎鼎的process explorer在普通账户下如……
[/Quote]
即使没有办法直接在批处理中获取管理员权限,那有没有办法检测当前批出理是否以管理员身份运行呢?
我的意思是,在批处理开始的时候检测一下,如果批处理没有以管理员身份运行,就立即告知用户然后退出程序。之后再让用户以管理员身份重新运行批处理,这样也行。
窗外雨潇潇 2011-08-13
  • 打赏
  • 举报
回复
这个可以尝试一下用NirCMD命令行工具(可到nirsoft.net搜索下载)实现。即在bat中需要以管理员身份才能执行的每个命令行前加入nircmd的以管理员权限启动的命令,命令格式:
NirCMD.exe elevate 程序.exe 参数

需要注意的是,NirCMD的elevate命令仅在win7和2008下有效。
Forever_Young 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 struggle1 的回复:]
runas 直接调用管理员执行... 省去提示信息 如何...
[/Quote]

runas 需要一个具有管理员权限的账号比如administrator,可是一般用户这个帐号默认都是禁用的,而且runas还需要提示输入账户密码,更闹心了。

lz这个要求依靠批处理在普通账户下执行,实现起来基本无望,连大名鼎鼎的process explorer在普通账户下如果不右键提权,获取信息都不全。
struggle1 2011-08-13
  • 打赏
  • 举报
回复
突破UAC....

呵呵呵 ...这个很闹心...
Forever_Young 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 deepbluetears 的回复:]
即使没有办法直接在批处理中获取管理员权限,那有没有办法检测当前批出理是否以管理员身份运行呢?
我的意思是,在批处理开始的时候检测一下,如果批处理没有以管理员身份运行,就立即告知用户然后退出程序。之后再让用户以管理员身份重新运行批处理,这样也行。
[/Quote]

批处理的内部命令肯定没戏,调用外部命令的程序,还是需要管理员权限,也是会提示,这不是绕了个圈还是有提示么,再说了枚举进程的权限本身就需要提权,找找有什么程序能完整突破UAC的。
woshidamowang11 2011-08-13
  • 打赏
  • 举报
回复
命令提示符
struggle1 2011-08-12
  • 打赏
  • 举报
回复
runas 直接调用管理员执行... 省去提示信息 如何...
DeepBlueTears 2011-08-12
  • 打赏
  • 举报
回复
如果根本办不到也麻烦来个人说一声啊……,不要一个回复都没有嘛…………
一、操作环境 制作64位合集,现有使用系统应是WIN8.1 X64(不需要安装ADK)。如果是WIN8 X64或WIN7 X64也可以,但必须安装ADK中的部署工具,批处理文件(.cmd)放在ADK安装目录中的DISM文件夹中,如:C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\amd64\DISM,这个目录下执行。 选择一个有30G以上空闲空间的分区作为工作分区,如,E分区,NTFS格式。 二、准备工作 以下路径不能错,否则批处理将失败。 1、下载附件,提取$OEM$-X64文件夹(32位与64位的有区别)到工作分区根目录。 2、在工作分区根目录新建一个叫做My-win8.1-X64的文件夹,将从MSDN下载的64位专业版(注:不要使用VL版的)ISO文件中的全部内容提取到My-win8.1-X64目录内。 这两个是专业版VL版的,本批处理不支持。 cn_windows_8_1_pro_vl_x64_dvd_2971907.iso cn_windows_8_1_pro_vl_x86_dvd_2972620.iso 需要采用下面这两个专业版的ISO文件: cn_windows_8_1_x64_dvd_2707237.iso ------------用于制作64位的合集 cn_windows_8_1_x86_dvd_2707405.iso ------------用于制作32位的合集 3、将My-win8.1-X64\sources中的install.wim移动到工作分区根目录,并改名为PRO-X64.WIM。 4、将从MSDN下载的64位企业版ISO文件中的SOURCES目录内的install.wim提取工作分区根目录,并改名为ENT-X64.WIM。 工作分区根目录下必须有以下两个文件夹和两个WIM文件: $OEM$-X64 ---文件夹 My-win8.1-X64 ---文件夹 PRO-X64.WIM ---WIM文件 ENT-X64.WIM ---WIM文件 三、执行批处理管理员身份执行制作批处理,一站式打包制作生成Win8.1_X64_Nin1_kms.iso。 批处理执行前,最好是关闭所有浏览器窗口和其他运行软件。批处理执行期间,请不要打开工作分区中一些临时产生的目录与相应的文件,或运行运行软件。 当然,如果是以内置管理员身份运行批处理那就更好了。在已经安装的系统中,如何开启用内置管理员(Administrator)? WIN+X键----计算机管理----系统工具----本地用户和组---用户----双击Administrator----将“帐户已禁用”的勾去掉,注销当前用户,就可以登录内置管理员帐户了。 四、其他说明 1:制作后工作分区TEMPWIM内是临时WIM文件,自己决定要不要删除。 2:不做32位与64位的合集,因为这样将导致原生支持64位UEFI启动的功能丧失,分开制作更好。 3:内置管理员版本可以实现一站式无人值守安装,中间无需人工干预,该用户管理权限也大,不过在应用上有限制。所以,使用此版本,安装后进入桌面,可以再建立一个普通管理员帐户,双用户使用比较理想。 方法:WIN+X键----计算机管理----系统工具----本地用户和组---用户--(右键,新用户)---双击新用户名--隶属于--添加--高级--立即查找---选中Administrators(组)--确定---注销当前用户就可以使用新用户名登录了。

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧