我希望编写一个脚本,该脚本需要用户输入,然后进行系统范围的更改。我需要它非常通用,但简单地说,我需要它在顶部以检查它是否以“作为管理员”身份运行。如果不是,那么我想显示一条消息告诉他们;如果是这样,我希望它继续下去。有固定的方法可以验证这一点吗?我不想以管理员身份启动新会话,我只是想检测它当前是否以管理员身份运行。
我希望编写一个脚本,该脚本需要用户输入,然后进行系统范围的更改。我需要它非常通用,但简单地说,我需要它在顶部以检查它是否以“作为管理员”身份运行。如果不是,那么我想显示一条消息告诉他们;如果是这样,我希望它继续下去。有固定的方法可以验证这一点吗?我不想以管理员身份启动新会话,我只是想检测它当前是否以管理员身份运行。
Answers:
在堆栈溢出中发现了这一点:
@echo off
goto check_Permissions
:check_Permissions
echo Administrative permissions required. Detecting permissions...
net session >nul 2>&1
if %errorLevel% == 0 (
echo Success: Administrative permissions confirmed.
) else (
echo Failure: Current permissions inadequate.
)
pause >nul
net session >nul 2>&1 && echo Success || echo Failure
。我发现此紧凑语法更方便。
这将检查高完整性级别。(适用于Windows Vista和更高版本)
@echo off
whoami /groups | find "S-1-16-12288" > nul
if %errorlevel% == 0 (
echo Welcome, Admin
) else (
echo Get lost, User
)
whoami
上缺少@week 。
很多很多的答案,这和整个SE多个其他问题(1,2,3仅举几例),所有这些都以这种方式或另一种是有缺陷的,已经清楚地表明,Windows不提供可靠的内置工具。因此,是时候推出您自己的了。
没有其他肮脏的骇客:
编译以下程序(遵循说明),或获取预编译的副本。这只需要执行一次,然后您就可以复制到.exe
各处(例如,与Sysinternals Suite一起)。
该代码可以在Win2k + 1中运行,无论是否带有UAC,域,可传递组,无论如何-因为在检查权限时它使用与系统本身相同的方式。chkadmin
打印“管理员”或“非管理员”,并将退出代码分别设置为0或1。可以通过/q
开关抑制输出。
chkadmin.c
:
#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")
int main(int argc, char** argv) {
BOOL quiet = FALSE;
DWORD cbSid = SECURITY_MAX_SID_SIZE;
PSID pSid = _alloca(cbSid);
BOOL isAdmin;
if (argc > 1) {
if (!strcmp(argv[1],"/q")) quiet=TRUE;
else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
}
if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}
if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}
if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
return !isAdmin;
}
要进行编译,请在Windows SDK命令提示符下运行:
cl /Ox chkadmin.c
(如果使用VS2012 +,则需要针对2k / XP进行更多调整)
该方法由/programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908提供
我发现,使用CMD脚本检查管理员权限的最干净方法是这样的:
@echo off
REM Calling verify with no args just checks the verify flag,
REM we use this for its side effect of setting errorlevel to zero
verify >nul
REM Attempt to read a particular system directory - the DIR
REM command will fail with a nonzero errorlevel if the directory is
REM unreadable by the current process. The DACL on the
REM c:\windows\system32\config\systemprofile directory, by default,
REM only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul
REM Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if errorlevel 1 echo has only User privs
此方法仅使用CMD.exe内置函数,因此它应该非常快。它还检查流程的实际功能,而不是检查SID或组成员身份,因此将测试有效权限。这可以追溯到Windows 2003和XP。普通用户进程或非提升进程使目录探测失败,而Admin或提升进程成功。
如果向Everyone
,BUILTIN\Users
或其他类似组授予了对systemprofile的读取权限,则该测试将失败。当然,这是非标准配置,而不是在配置为Windows域控制器的计算机上,该计算机赋予“ NT AUTHORITY \ Authenticated Users”对系统配置文件的读取/执行权限。
verify
。我倾向于使用cd .
(cd空格点)将错误级别设置为0,不产生任何输出,并且对于通过创建零长度文件也很有用cd . >somefile
。就是说,我在Windows 2000,XP,Vista,2003、2008、2012、7、8和10上测试了“ dir”。如果成功,所有这些“ dir”将在成功时将错误级别清除为0。 'dir'。因此,我不确定威廉为什么会使用“验证”来首先清除错误级别。