检查当前命令提示符是否以管理员身份启动

检查当前命令提示符是否以管理员身份启动

我想编写一个脚本,它接受用户输入,然后进行系统范围的更改。我需要这个脚本非常通用,但简单地说,在顶部,我需要它检查它是否以“管理员身份”运行。如果不是,那么我想显示一条消息告诉他们;如果是,我希望它继续运行。是否有一个恒定的方法来验证这一点?我不想以管理员身份开始新会话,我只是想探测如果它当前以管理员身份运行

答案1

发现这个堆栈溢出

@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

答案2

这将检查高完整性级别。(适用于 Windows Vista 及更高版本)

@echo off

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

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)

答案3

SE 上对这个问题以及许多其他问题的答案有很多(123所有这些软件(例如 Windows 7 和 Windows 8)都存在这样或那样的缺陷,这清楚地表明 Windows 并没有提供可靠的内置实用程序。所以,是时候推出自己的实用程序了。

无需进一步的肮脏黑客:

编译以下程序(以下说明),或获取预编译的副本。这只需执行一次,然后你可以将其复制到.exe任何地方(例如Sysinternals 套件)。

该代码在 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 为目标,则需要进行更多调整


该方法由https://stackoverflow.com/questions/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

1 MSDN 声称 API 是 XP+ 但这是错误的。CheckTokenMembership 是 2k+另一个甚至更老

答案4

如果用户滥用安装过程中创建的“受保护的”管理员帐户在资源管理器中打开此目录并让其修改权限,则 DIR“%SystemRoot%\System32\Config...”会失败。

最好使用以下命令序列之一:

DATE %DATE% 2>NUL:
IF ERRORLEVEL 1 ECHO Unprivileged!

TIME %TIME% 2>NUL:
IF NOT ERRORLEVEL 1 ECHO Privileged!

相关内容