从一个批处理文件中,我想测试我是否正在使用管理员/提升的特权运行。
选择“以管理员身份运行”时,用户名不会更改,因此不起作用。
如果有一个普遍可用的命令,该命令无效但需要管理特权,那么我可以运行该命令并检查错误代码,以测试特权。到目前为止,我还没有找到这样的命令。我发现的命令似乎返回单个非特定的错误代码,该错误代码可能指示任何内容,并且由于各种原因,它们很容易失败。
我只关心Windows 7,尽管对早期操作系统的支持会很好。
从一个批处理文件中,我想测试我是否正在使用管理员/提升的特权运行。
选择“以管理员身份运行”时,用户名不会更改,因此不起作用。
如果有一个普遍可用的命令,该命令无效但需要管理特权,那么我可以运行该命令并检查错误代码,以测试特权。到目前为止,我还没有找到这样的命令。我发现的命令似乎返回单个非特定的错误代码,该错误代码可能指示任何内容,并且由于各种原因,它们很容易失败。
我只关心Windows 7,尽管对早期操作系统的支持会很好。
Answers:
附录:对于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的退出代码以供批处理文件使用。
AT
在Windows 8上不起作用,但是我找到了更好的解决方案。我将其发布为另一个问题的答案,在这里:stackoverflow.com/questions/4051883/…。
ping
替换丢失的内容sleep
:)
此技巧仅需一个命令:net session
在命令提示符下键入。
如果您不是管理员,则会收到拒绝访问消息。
System error 5 has occurred.
Access is denied.
如果您是管理员,则会收到不同的消息,最常见的是:
There are no entries in the list.
来自MS Technet:
使用不带参数的net session可以显示有关与本地计算机的所有会话的信息。
There are no entries in the list.
在Windows 10 Pro中打印
net session >nul 2>&1 || (echo not admin&goto :eof)
我喜欢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
然后手动扫描线。不会花费太长的时间,命令就适合您的大脑。
在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使用的完整性级别SID:http : //msdn.microsoft.com/zh-cn/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的Chris Jackson:
在高空运行时,令牌包含一个称为“强制标签\高强制级别”的ACE。
我阅读了很多(大多数?)答复,然后开发了一个在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”的值设置为“是”或“否”。
如果您以具有管理员权限的用户身份运行,那么将不会定义环境变量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)
这是我在Windows 7到Windows 10上使用的一种简单方法。基本上,我只使用“ IF EXIST”命令检查Windows \ System32 \ WDI \ LogFiles文件夹。从Windows 7开始(至少从7开始),WDI文件夹存在于每一次Windows安装中,并且需要管理员权限才能访问。WDI文件夹中始终始终有一个LogFiles文件夹。因此,如果以admin身份运行,则在WDI \ LogFiles文件夹上运行“ IF EXIST”将返回true,如果不以admin运行,则将返回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%有效。
echo > somefile
进入需要管理员权限的目录。它会产生一个副作用的文件,但是您可以检查冲突并创建唯一的文件名来解决。