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)
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)
对于这个问题以及 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+了,另一个更老了。
归档时间: |
|
查看次数: |
23510 次 |
最近记录: |