如何检测CMD是否以管理员身份运行/具有提升的权限?

时间:2011-11-02 18:50:13

标签: windows command-line cmd

在批处理文件中,我想测试我是否使用Administrator /提升权限运行。

选择“以管理员身份运行”时,用户名不会更改,因此无效。

如果存在普遍可用的命令,该命令无效但需要管理权限,那么我可以运行该命令并检查错误代码以便测试权限。到目前为止,我还没有找到这样的命令。我发现的命令似乎返回一个非特定的错误代码,它可以指示任何内容,并且由于各种原因它们很容易失败。

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

13 个答案:

答案 0 :(得分:67)

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

如果您不是管理员,则会收到拒绝访问的消息。

来自MS Technet

  

在没有参数的情况下使用,net session显示有关所有参数   与本地计算机的会话。

答案 1 :(得分:52)

ADDENDUM :对于Windows 8,这不起作用;请改为this excellent answer


在此处找到此解决方案: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)

如果不是(也可能不是,因为您明确提出了批处理文件),那么您可以在.NET中编写上述内容,并根据批处理文件的结果从exe中返回退出代码。

答案 2 :(得分:25)

我喜欢Rushyo建议使用AT,但这是另一种选择:

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

如果您愿意,此方法还允许您区分非管理员和非高级管理员。非提升管理员仍然在组列表中有BUILTIN \ Administrators,但未启用。

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

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

(这应该适用于Windows 7,但我不确定早期版本。)

答案 3 :(得分:15)

与其他人之前提出的相似,但作为一个可以放在批处理命令开头的单行程序。 (好吧,通常在@echo关闭之后。)

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

答案 4 :(得分:10)

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

检查我们是否正在升级:

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

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

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

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

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

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

答案 5 :(得分: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's Chris Jackson

  

当您运行提升时,您的令牌包含一个名为Mandatory Label \ High Mandatory Level的ACE。

答案 6 :(得分:6)

我读了很多(大多数?)响应,然后开发了一个在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

希望有人觉得这很有用:)

答案 7 :(得分:4)

解决方案:

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 )

答案 8 :(得分:2)

https://stackoverflow.com/a/38856823/2193477

的“非一线”版本
@echo off
net.exe session 1>NUL 2>NUL || goto :not_admin
echo SUCCESS
goto :eof

:not_admin
echo ERROR: Please run as a local administrator.
exit /b 1

答案 9 :(得分:1)

我知道我参加这个派对的时间已经很晚了,但这是我的一个班轮来决定管理员。

它不依赖于错误级别,仅依赖于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%)

返回yes或no,具体取决于用户的管理状态......

它还将变量“admin”的值设置为相应的yes或no。

答案 10 :(得分:1)

如果您以具有管理员权限的用户身份运行,那么将不会定义环境变量SessionName,并且在运行批处理文件时您仍然没有管理员权限。

您应使用“ net session”命令并查找错误返回码“ 0”以验证管理员权限。

示例; -第一个echo语句是响铃字符 net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)

答案 11 :(得分:0)

这是我在Windows 7到Windows 10上使用的一种简单方法。基本上,我只是使用“ IF EXIST”命令来检查Windows \ System32 \ WDI \ LogFiles文件夹。从Windows 7开始(至少从7开始),WDI文件夹存在于每一次Windows安装中,并且需要管理员特权才能访问。 WDI文件夹中始终始终有一个LogFiles文件夹。因此,如果以admin身份运行,则在WDI \ LogFiles文件夹上运行“ IF EXIST”将返回true,否则,则返回false。可以在批处理文件中使用它来检查特权级别,并根据该结果跳转到所需的任何命令。

下面是示例代码的简短摘要:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

请记住,此方法假定未对WDI文件夹修改默认的安全权限(在大多数情况下不太可能发生,但请参阅下面的警告2)。即使在这种情况下,也只需修改代码以检查是否需要管理员访问权限的其他通用文件/文件夹(System32 \ config \ SAM可能是一个不错的替代选择),或者甚至可以为此专门创建自己的文件夹目的。

关于此方法有两个警告:

  1. 禁用UAC可能会通过一个简单的事实来打破它,那就是无论如何一切都将以管理员身份运行。

  2. 尝试在Windows资源管理器中打开WDI文件夹,然后在出现提示时单击“继续”,将为该用户帐户添加永久访问权限,从而破坏了我的方法。如果发生这种情况,可以通过从WDI文件夹安全权限中删除用户帐户来解决。如果由于某种原因用户必须能够使用Windows资源管理器访问WDI文件夹,则您必须修改代码以检查其他文件夹(如上所述,为此专门创建自己的文件夹可能是个不错的选择)

因此,可以承认,我的方法并不是很完美,因为它可能会被破坏,但是它是一种相对较快的方法,易于实现,并且与Windows 7、8和10的所有版本均兼容,并且请注意提到的警告对我而言100%有效。

答案 12 :(得分:0)

适用于Win7 Enterprise和Win10 Enterprise的作品

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)