ChatGPT解决这个技术问题 Extra ChatGPT

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

从批处理文件中,我想测试我是否以管理员/提升的权限运行。

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

如果有一个通用的命令,它没有效果,但需要管理权限,那么我可以运行它并检查错误代码以测试权限。到目前为止,我还没有找到这样的命令。我发现的命令似乎返回了一个单一的、非特定的错误代码,它可能表明任何事情,并且由于各种原因它们很容易失败。

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

一种 hack 将尝试在需要管理员权限的目录中执行 echo > somefile。它会产生一个文件作为副作用,但您可以检查冲突并创建一个唯一的文件名作为解决方法。
[您可以在此处找到自升批次][1] [1]:stackoverflow.com/questions/4051883/…
@npocmaka 您链接的问题实际上是这个问题的副本;)(2013 年与 2011 年)

A
Ambrose Leung

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

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

System error 5 has occurred.

Access is denied.

如果您是管理员,您会收到不同的消息,最常见的是:

There are no entries in the list.

MS Technet

不带参数使用时,net session 显示有关与本地计算机的所有会话的信息。


这在功能上与 Rushyo 使用 AT 命令的答案相同。
在 Windows 8.1 上,这比 AT 更受欢迎,因为 AT 已被弃用。使用 Rushyo 的答案,但用 net session 或 net.exe session 代替 AT 对我来说非常适合。
这似乎是在命令提示符下执行此操作的最简单方法(但与批处理文件不同)。
只需在 Windows 10 Pro 中打印 There are no entries in the list.
在批处理文件中使用类似的东西:net session >nul 2>&1 || (echo not admin&goto :eof)
A
Alexandre Rondeau

附录:对于 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 中返回退出代码。


AT指令很完美!你的 Google-fu 优于我的 Google-fu。 ;-)
+1 @Rushyo,我扩展了您的解决方案并将其发布在这里,因为这是我最初遇到的。谢谢! stackoverflow.com/questions/4051883/…
AT 在 Windows 8 上不起作用,但我找到了更好的解决方案。我已将它作为另一个问题的答案发布在这里:stackoverflow.com/questions/4051883/…
我推荐 whoami /groups | findstr /b BUILTIN\Admin | findstr /c:"已启用组" && echo "我有管理员!" - 在 95、98、2000、xp、vista、7、8 上工作! (来自评论“我喜欢 Rushyo 对使用 AT 的建议......”)
在 Windows 10 中不推荐使用 Commad AT。使用命令“net session”,请参阅下面的帖子。
H
Harry Johnston

我喜欢 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,但我不确定早期版本。)


在波兰语版本中,我有:BUILTIN\Administratorzy,所以,我推荐:whoami /groups | findstr /b BUILTIN\Admin | findstr /c:"启用组" && goto :isadministrator
@barwnikk,我推荐 whoami/groups 然后手动扫描行。不会花费太长时间,并且该命令适合您的大脑。
@Pacerier:问题的关键是检测批处理文件中的海拔。如果一个人在命令行,他们需要做的就是查看窗口标题,如果你被提升,它总是以“管理员:”开头。
@HarryJohnston,哇没有意识到这一点。所有版本的 Windows 都会出现“管理员”标题吗?
@Pacerier:所有当前版本(Vista 以上)。
g
geek_01

几乎是其他人之前放的,但作为一个可以放在批处理命令开头的衬里。 (嗯,通常在@echo 关闭之后。)

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

这是最新版本,它很好地隐藏了 net.exe 的不相关输出
在 Windows 10 上运行良好。
效果很好,只是将结尾调整为 & Timeout /t 10 & Exit /b 1) 以便在批处理文件中窗口不会立即消失。
M
Martin Binder

在 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


whoami /groups 有一个极端情况,您会得到错误的信息。请参阅stackoverflow.com/questions/4051883/…
H
Hugh

这是对哈利的回答的轻微修改,重点是提升地位;我在 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。


whoami /groups 有一个极端情况,您会得到错误的信息。请参阅stackoverflow.com/questions/4051883/…
u
user1438038

解决方案:

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 )

G
GeoffH

我阅读了许多(大部分?)的回复,然后开发了一个在 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

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


whoami /groups 有一个极端情况,您会得到错误的信息。请参阅stackoverflow.com/questions/4051883/…
这次真是万分感谢!其他“whoami”解决方案在 Windows 8.1 上对我不起作用。这个做到了。
t
tivnet

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

u
user1

我知道我参加这个聚会真的很晚了,但这是我确定管理员身份的唯一方法。

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

它返回是或否,具体取决于用户的管理员状态...

它还将变量“admin”的值相应地设置为等于或否。


这仅在用户是管理员本地组的直接成员时才有效。如果用户是属于管理员组成员的域组(例如,“域管理员”)的成员,则它将不起作用。
e
englebart

适用于 Win7 企业版和 Win10 企业版

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

W
Wolfgang

如果您以具有管理员权限的用户身份运行,则不会定义环境变量 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)


k
kfsone

不幸的是,其他人建议的“S-1-5-32-544”并不是海拔证明。

Windows 10 及更高版本,独立于语言的方法是:

whoami /groups | find "S-1-16-12288"

这是“高强制级别”,实际上是升级的。

常规命令提示符:

C:\> whoami /groups | find "S-1-16-12288"
C:\>

管理员命令提示符:

C:\> whoami /groups | find "S-1-16-12288"
Mandatory Label\High Mandatory Level                          Label            S-1-16-12288                                                                                                                                                     


C:\>

要在 .bat 文件中使用:

whoami /groups | find "S-1-16-12288" && set ELEVATED=true || set ELEVATED=false

您也可以从 powershell 使用它:

function is_elevated() {
  Param( [String] $ToGroup = "S-1-16-12288" )
  return [bool] ( whoami /groups | select-string $ToGroup )
}

例如:

PS> cd c:/temp
PS> set-content is-elevated.ps1 "return [bool] ( whoami /groups | sls S-1-16-12288 )"
PS> ./is-elevated.ps1
False
PS> start -verb runas powershell.exe
...
PS C:\Windows\system32> cd \temp
PS C:\temp> ./is-elevated.ps1
True

T
Torin Darkflight

这是我在 Windows 7 到 Windows 10 上使用的一个简单方法。基本上,我只是使用“IF EXIST”命令来检查 Windows\System32\WDI\LogFiles 文件夹。 WDI 文件夹存在于至少从 7 开始的每个 Windows 安装中,并且需要管理员权限才能访问。 WDI 文件夹中始终有一个 LogFiles 文件夹。因此,如果以管理员身份运行,则在 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 可能是一个很好的替代候选者),或者您甚至可以专门为此创建自己的目的。

不过,这种方法有两个注意事项:

禁用 UAC 可能会打破一切都将以管理员身份运行的简单事实。尝试在 Windows 资源管理器中打开 WDI 文件夹,然后在出现提示时单击“继续”将为该用户帐户添加永久访问权限,从而破坏了我的方法。如果发生这种情况,可以通过从 WDI 文件夹安全权限中删除用户帐户来修复它。如果出于任何原因用户必须能够使用 Windows 资源管理器访问 WDI 文件夹,那么您必须修改代码以检查不同的文件夹(如上所述,为此目的创建您自己的文件夹可能是一个不错的选择) .

所以,诚然我的方法并不完美,因为它可能会被破坏,但它是一种相对快速的方法,易于实施,与 Windows 7、8 和 10 的所有版本同样兼容,并且只要我留意上述警告对我来说是 100% 有效的。