从批处理文件中,我想测试我是否以管理员/提升的权限运行。
选择“以管理员身份运行”时,用户名不会更改,因此不起作用。
如果有一个通用的命令,它没有效果,但需要管理权限,那么我可以运行它并检查错误代码以测试权限。到目前为止,我还没有找到这样的命令。我发现的命令似乎返回了一个单一的、非特定的错误代码,它可能表明任何事情,并且由于各种原因它们很容易失败。
我只关心 Windows 7,虽然支持早期的操作系统会很好。
echo > somefile
。它会产生一个文件作为副作用,但您可以检查冲突并创建一个唯一的文件名作为解决方法。
这个技巧只需要一个命令:在命令提示符中输入 net session
。
如果您不是管理员,则会收到拒绝访问消息。
System error 5 has occurred.
Access is denied.
如果您是管理员,您会收到不同的消息,最常见的是:
There are no entries in the list.
从 MS Technet:
不带参数使用时,net session 显示有关与本地计算机的所有会话的信息。
附录:对于 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
在 Windows 8 上不起作用,但我找到了更好的解决方案。我已将它作为另一个问题的答案发布在这里:stackoverflow.com/questions/4051883/…。
我喜欢 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
然后手动扫描行。不会花费太长时间,并且该命令适合您的大脑。
几乎是其他人之前放的,但作为一个可以放在批处理命令开头的衬里。 (嗯,通常在@echo 关闭之后。)
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
在 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
这是对哈利的回答的轻微修改,重点是提升地位;我在 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。
解决方案:
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 )
我阅读了许多(大部分?)的回复,然后开发了一个在 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
希望有人觉得这很有用:)
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
我知道我参加这个聚会真的很晚了,但这是我确定管理员身份的唯一方法。
它不依赖于错误级别,只依赖于 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”的值相应地设置为等于或否。
适用于 Win7 企业版和 Win10 企业版
@if DEFINED SESSIONNAME (
@echo.
@echo You must right click to "Run as administrator"
@echo Try again
@echo.
@pause
@goto :EOF
)
如果您以具有管理员权限的用户身份运行,则不会定义环境变量 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)
不幸的是,其他人建议的“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
这是我在 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% 有效的。
There are no entries in the list.
net session >nul 2>&1 || (echo not admin&goto :eof)