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

Can*_*uke 24 windows command-line

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

Ale*_*lex 20

Stack Overflow上找到了这个:

@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
Run Code Online (Sandbox Code Playgroud)

  • 这需要运行“服务器”服务。 (9认同)
  • 相同的想法,但使用条件执行运算符:`net session >nul 2>&1 && echo Success || 回声失败`。我发现这种紧凑的语法更方便。 (2认同)

wee*_*eek 11

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

@echo off

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

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)
Run Code Online (Sandbox Code Playgroud)

  • 如果我只是打开命令提示符,这会起作用。如果我以管理员身份运行 CMD,它仍然显示它以用户身份运行 (2认同)
  • @Alex 对更多操作系统的支持很棒,但这种方法更可靠,因为它直接查询授予当前会话的权限,而不是不存在不太可靠的否定来推断肯定。 (2认同)
  • 一周, whoami /groups 有一个边缘情况,你会得到错误的信息。见 http://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/30921854#30921854 (2认同)

iva*_*eev 5

对于这个问题以及 SE 中的多个其他问题(仅举几例,1、2、3 有很多很多的答案,所有这些答案都以这种或那种方式存在缺陷,已经清楚地表明 Windows 不提供可靠的内置实用程序。所以,是时候推出你自己的了。

没有任何进一步的肮脏黑客:

编译以下程序(说明如下),或获取预编译副本。这只需要完成一次,然后您就可以复制到.exe任何地方(例如与Sysinternals Suite一起)。

该代码可以在 Win2k+ 1中运行,无论有或没有 UAC、域、传递组等等 - 因为它在检查权限时使用与系统本身相同的方式。chkadmin打印“Admin”或“Non-admin”并将退出代码分别设置为 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;
}
Run Code Online (Sandbox Code Playgroud)

要编译,请在 Windows SDK 命令提示符下运行:

cl /Ox chkadmin.c
Run Code Online (Sandbox Code Playgroud)

(如果使用VS2012+,如果需要针对2k/XP,则需要更多调整


该方法由/sf/ask/296142171/#4230908提供

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