如何检测CMD是否以pipe理员身份运行/具有较高的权限?

从batch file中,我想testing我是否以pipe理员/提升特权运行。

当“以pipe理员身份运行”被选中时,用户名不会改变,所以这是行不通的。

如果有一个普遍可用的命令,它没有任何作用,但需要pipe理权限,那么我可以运行它,并检查错误代码,以testing特权。 到目前为止,我还没有find这样的命令。 我发现的命令似乎会返回一个非特定的错误代码,这可能表示任何事情,而且由于各种原因,这些错误代码很容易出错。

我只关心Windows 7,虽然支持早期的操作系统会很好。

附录 :对于Windows 8,这将不起作用; 请看这个优秀的答案 。


在这里find这个解决scheme: http : //www.robvanderwoude.com/clevertricks.php

 AT > NUL IF %ERRORLEVEL% EQU 0 ( ECHO you are Administrator ) ELSE ( ECHO you are NOT Administrator. Exiting... PING 127.0.0.1 > NUL 2>&1 EXIT /B 1 ) 

假设这是行不通的,因为我们正在谈论Win7,你可以在Powershell中使用以下内容:

 $principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent()) $principal .IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) 

如果没有(也可能没有,因为你明确提出了batch file),那么你可以在.NET中写上述代码,并根据你要使用的batch file的结果从exe中返回一个退出代码。

这个技巧只需要一个命令:在命令提示符下键入net session

如果你不是pipe理员,你会得到一个被拒绝的信息。

来自MS Technet :

使用不带参数的networking会话将显示有关本地计算机的所有会话的信息。

我喜欢Rushyo使用AT的build议,但这是另一个select:

 whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator 

如果您愿意,这种方法也可以让您区分非pipe理员和非pipe理员。 未升级的pipe理员在组列表中仍然具有BUILTIN \ Administrators,但未启用。

但是,这不适用于某些非英语语言系统。 相反,尝试

 whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator 

(这应该在Windows 7上工作,但我不确定早期版本。)

哈里的回答略微修改,重点在于提升状态; 我在install.bat文件的开头使用这个:

 set IS_ELEVATED=0 whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1 if %IS_ELEVATED%==0 ( echo You must run the command prompt as administrator to install. exit /b 1 ) 

这对我来说肯定有效,原理似乎是合理的。 来自MSFT的Chris Jackson :

当您运行提升时,您的令牌包含一个名为强制标签\高强制性级别的ACE。

在Vista,Win 7及更高版本上执行此操作的最简单方法是枚举令牌组并查找当前的完整性级别(或pipe理员sid,如果只有组成员身份很重要):

检查我们是否运行提升:

 whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-) 

检查我们是否属于本地pipe理员:

 whoami /groups | find "S-1-5-32-544" && Echo I am a local admin 

检查我们是否属于域pipe理员:

 whoami /groups | find "-512 " && Echo I am a domain admin 

以下文章列出了Windows使用的完整性级别SID: http : //msdn.microsoft.com/en-us/library/bb625963.aspx

我读了很多(最?)的回答,然后在Win 8.1中开发了一个适合我的bat文件。 以为我会分享。

 setlocal set runState=user whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system echo Running in state: "%runState%" if not "%runState%"=="user" goto notUser echo Do user stuff... goto end :notUser if not "%runState%"=="admin" goto notAdmin echo Do admin stuff... goto end :notAdmin if not "%runState%"=="system" goto notSystem echo Do admin stuff... goto end :notSystem echo Do common stuff... :end 

希望有人认为这有用:)

与其他人之前所做的一样,但是作为一个可以放在批处理命令开头的单线程。 (好吧,通常在@echoclosures之后。)

 net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1) 

我知道我真的很晚参加这个派对,但是这里是我的一个class轮,以确定pipe理。

它不依赖于错误级别,只是在systeminfo

 for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%) 

它返回的是或不是,取决于用户的pipe理状态…

它还将variables“admin”的值设置为相应的“是”或“否”。

我不太清楚为什么,但这里没有其他解决scheme为我工作。 所以我认为这可能是值得分享的, 这个来自超级用户的伎俩。

解决scheme:

 at >nul if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator ) 

在Windows 10下不起作用

对于所有版本的Windows都可以这样做:

 openfiles >nul 2>&1 if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )