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

Jef*_*eff 86 windows command-line cmd

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

选择"以管理员身份运行"时,用户名不会更改,因此不起作用.

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

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

Amb*_*ung 77

这个技巧只需要一个命令:输入net session命令提示符.

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

来自MS Technet:

如果不使用参数,net session将显示有关与本地计算机的所有会话的信息.

  • 在Windows 8.1上,这是AT的首选,因为不推荐使用AT.使用Rushyo的答案但用**网****或**net.exe session**代替**AT**对我来说非常适合. (9认同)
  • 这似乎是在命令提示符下执行此操作的最简单方法(尽管与批处理文件不同)。 (2认同)
  • 只打印“列表中没有条目。”在 Windows 10 专业版中 (2认同)
  • 在批处理文件中使用类似的内容:`net session >nul 2>&1 || (回显不是 admin&goto :eof)` (2认同)

Rus*_*hyo 58

附录:对于Windows 8,这不起作用; 反而看到这个优秀的答案.


在这里找到这个解决方案: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
)
Run Code Online (Sandbox Code Playgroud)

假设这不起作用,因为我们正在谈论Win7,你可以在Powershell中使用以下内容,如果这是合适的:

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

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

  • `AT`在Windows 8上不起作用,但我找到了更好的解决方案.我已将其作为另一个问题的答案发布在此处:http://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights#11995662. (16认同)
  • AT命令很完美!你的Google-fu优于我的Google-fu.;-) (4认同)
  • 我推荐whoami/groups | findstr/b BUILTIN\Admin | findstr/c:"启用组"&& echo"我有管理员!" - 工作95,98,2000,xp,vista,7,8!(来自评论"我喜欢Rushyo的使用AT ...") (4认同)
  • +1 @Rushyo,我稍微扩展了你的解决方案并将其发布在这里,因为那是我最初遇到的那个.谢谢!http://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/8995407#8995407 (2认同)
  • Command AT 在 Windows 10 中已弃用。使用命令“net session”,请参阅下面的帖子。 (2认同)

Har*_*ton 25

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

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator
Run Code Online (Sandbox Code Playgroud)

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

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

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator
Run Code Online (Sandbox Code Playgroud)

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


gee*_*_01 18

几乎是其他人之前提出的,但作为一个可以放在批处理命令开头的单线程.(好吧,通常在@echo关闭之后.)

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

  • 这是最新版本,它很好地隐藏了 net.exe 的无关输出 (2认同)
  • 在 Windows 10 上运行良好。 (2认同)

小智 11

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

检查我们是否正在升级:

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

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

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin
Run Code Online (Sandbox Code Playgroud)

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

whoami /groups | find "-512 " && Echo I am a domain admin
Run Code Online (Sandbox Code Playgroud)

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


Hug*_*ugh 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
)
Run Code Online (Sandbox Code Playgroud)

这绝对对我有用,原则似乎是合理的; 来自MSFT的Chris Jackson:

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


小智 7

解决方案:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
Run Code Online (Sandbox Code Playgroud)

在Windows 10下不起作用

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

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )
Run Code Online (Sandbox Code Playgroud)


Geo*_*ffH 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
Run Code Online (Sandbox Code Playgroud)

希望有人发现这个有用:)