我想从批处理文件内部测试是否以管理员/提升权限运行。
当选择“以管理员身份运行”时,用户名不会更改,因此这种方法不起作用。
如果存在一个普遍可用的命令,它没有任何影响,但需要管理员权限,那么我可以运行该命令并检查错误代码以测试权限。到目前为止,我还没有找到这样的命令。我发现的命令似乎只返回单个、不具体的错误代码,可能表示任何事情,并且容易因各种原因而失败。
我只关心Windows 7,尽管支持早期操作系统也很好。
我想从批处理文件内部测试是否以管理员/提升权限运行。
当选择“以管理员身份运行”时,用户名不会更改,因此这种方法不起作用。
如果存在一个普遍可用的命令,它没有任何影响,但需要管理员权限,那么我可以运行该命令并检查错误代码以测试权限。到目前为止,我还没有找到这样的命令。我发现的命令似乎只返回单个、不具体的错误代码,可能表示任何事情,并且容易因各种原因而失败。
我只关心Windows 7,尽管支持早期操作系统也很好。
这个技巧只需要一个命令: 在命令提示符中键入net session
。
如果您不是管理员,则会收到"访问被拒绝"的消息。
System error 5 has occurred.
Access is denied.
如果你是管理员,你会收到一条不同的消息,其中最常见的是:
There are no entries in the list.
来自MS Technet:
如果没有带参数使用,net session 会显示关于所有与本地计算机有关的会话信息。
net session >nul 2>&1 || (echo not admin&goto :eof)
- anilech附录:在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
)
如果那个方法不起作用,鉴于我们正在讨论的是Win7,您可以在适当情况下在Powershell中使用以下内容:
$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
如果不是(很可能不是,因为您明确提出了批处理文件),那么您可以在.NET中编写上述内容,并从exe返回退出代码,以基于批处理文件使用的结果。
其他人之前已经说得差不多了,但这里提供一个可以放在批处理命令开头的单行代码。(通常在@echo off之后)
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
我喜欢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上应该可以工作,但我不确定早期版本是否可以。)
whoami /groups
给了我正确的信息:该组存在但已禁用。我的代码检查该组是否启用,因此在您的情况下不应给出错误答案。 - Harry Johnston在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
以下文章列出了Windows使用的完整性级别SIDs:http://msdn.microsoft.com/en-us/library/bb625963.aspx
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 )
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
)
我阅读了许多(大多数?)回复,然后在Win 8.1上开发了一个对我有效的批处理文件。想和大家分享一下。
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
希望有人会觉得这很有用 :)
一段关于 https://dev59.com/22sz5IYBdhLWcg3wTl-r#38856823 的非单行版本。
@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
很遗憾,其他人建议的"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
echo > somefile
执行到需要管理员权限的目录中。这会产生一个文件作为副作用,但你可以检查冲突并创建一个唯一的文件名作为解决方法。 - Marc B