我想编写一个脚本,它接受用户输入,然后进行系统范围的更改。我需要这个脚本非常通用,但简单地说,在顶部,我需要它检查它是否以“管理员身份”运行。如果不是,那么我想显示一条消息告诉他们;如果是,我希望它继续运行。是否有一个恒定的方法来验证这一点?我不想以管理员身份开始新会话,我只是想探测如果它当前以管理员身份运行
答案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 上对这个问题以及许多其他问题的答案有很多(1,2,3所有这些软件(例如 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 为目标,则需要进行更多调整)
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!