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


21

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



@ g-man有什么关系?
加拿大卢克REINSTATE MONICA

它还要求提供无论是否以“管理员身份”运行都将表现不同的命令-至少它得到了答案。
G-Man说'Restorestate Monica''Feb

Answers:


16

堆栈溢出中发现了这一点:

@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

它被删除的原因是什么?
加拿大卢克REINSTATE MONICA 2013年

无论是从管理员帐户还是当我以受限用户身份运行,但都选择“以管理员身份运行”时,此方法都有效
Canadian Luke REINSTATE MONICA 2013年

2
相同的想法,但使用条件执行运算符:net session >nul 2>&1 && echo Success || echo Failure。我发现此紧凑语法更方便。
dbenham

6
这要求“服务器”服务正在运行。
ivan_pozdeev

8

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

@echo off

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

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

1
WHOAMI在xp我awnser是更好的支持从Windows所有操作系统不支持XP升级到Windows 8
亚历克斯

2
如果我仅打开命令提示符,则此方法有效。如果我以管理员身份运行CMD,它仍然表明它是作为用户运行的
加拿大卢克REINSTATE MONICA 2013年

2
@Alex对更多操作系统的支持很棒,但是这种方法更可靠,因为它直接查询授予当前会话的权限,而不是缺少可靠性较差的否定项来推断肯定项。
Iszi 2014年

2
一周,whoami / groups遇到了一个极端情况,您会收到错误的信息。见stackoverflow.com/questions/4051883/...
zumalifeguard

1
XP whoami上缺少@week 。
ivan_pozdeev

4

很多很多的答案,这和整个SE多个其他问题(123仅举几例),所有这些都以这种方式或另一种是有缺陷的,已经清楚地表明,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提供

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


3

我发现,使用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或提升进程成功。

如果向EveryoneBUILTIN\Users或其他类似组授予了对systemprofile的读取权限,则该测试将失败。当然,这是非标准配置,而不是在配置为Windows域控制器的计算机上,该计算机赋予“ NT AUTHORITY \ Authenticated Users”对系统配置文件的读取/执行权限。


> verify VERIFY已关闭。>验证/?告诉cmd.exe是否验证文件是否正确写入磁盘。验证[开启| [OFF]键入不带参数的VERIFY以显示当前VERIFY设置。该命令如何帮助脚本?
加拿大卢克REINSTATE MONICA

3
@Canadian Luke,如果没有错误,某些内置命令不会清除错误级别。因此,人们养成了使用hack等清除错误级别的习惯verify。我倾向于使用cd .(cd空格点)将错误级别设置为0,不产生任何输出,并且对于通过创建零长度文件也很有用cd . >somefile。就是说,我在Windows 2000,XP,Vista,2003、2008、2012、7、8和10上测试了“ dir”。如果成功,所有这些“ dir”将在成功时将错误级别清除为0。 'dir'。因此,我不确定威廉为什么会使用“验证”来首先清除错误级别。
user3347790 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.