Kiểm tra xem Command Prompt hiện tại có được khởi chạy với tư cách Quản trị viên không


21

Tôi đang tìm cách viết một kịch bản lấy đầu vào của người dùng, sau đó thực hiện các thay đổi trên toàn hệ thống. Tôi cần cái này rất chung chung, nhưng đơn giản, ở trên cùng, tôi cần nó để kiểm tra xem nó có đang chạy 'Với tư cách là Quản trị viên' hay không. Nếu không, thì tôi muốn hiển thị một thông báo để nói với họ rằng; nếu có, tôi muốn nó tiếp tục. Có một cách liên tục để xác minh điều này? Tôi không muốn bắt đầu một phiên mới với tư cách Quản trị viên, tôi chỉ muốn phát hiện nếu nó hiện đang chạy với tư cách quản trị viên



@ g-man nó liên quan như thế nào?
Luke Luke REINSTATE MONICA của Canada

Nó cũng yêu cầu các lệnh sẽ hoạt động khác đi nếu chạy với tư cách Quản trị viên hay không - hoặc ít nhất là nó nhận được các câu trả lời.
G-Man nói 'Phục hồi Monica'

Câu trả lời:


16

Tìm thấy điều này trên 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

Lý do nó đã bị xóa là gì?
Luke Luke REINSTATE MONICA Canada

Điều này hoạt động, cả từ tài khoản Quản trị viên khi tôi chạy với tư cách là người dùng hạn chế, nhưng chọn 'Chạy với tư cách Quản trị viên'
Luke Luke REINSTATE MONICA

2
Cùng một ý tưởng, nhưng sử dụng các toán tử thực thi có điều kiện : net session >nul 2>&1 && echo Success || echo Failure. Tôi thấy cú pháp nhỏ gọn này thuận tiện hơn.
dbenham

6
Điều này đòi hỏi dịch vụ "Máy chủ" phải được chạy.
ivan_pozdeev

8

Điều này kiểm tra mức độ toàn vẹn cao. (hoạt động cho Windows Vista trở lên)

@echo off

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

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

1
Whoami không được hỗ trợ trong xp, awnser của tôi hỗ trợ tốt hơn tất cả hệ điều hành từ windows xp đến windows 8
Alex

2
Điều này hoạt động nếu tôi chỉ mở Dấu nhắc lệnh. Nếu tôi chạy CMD với tư cách Quản trị viên, điều đó vẫn cho thấy rằng nó vẫn chạy như một người dùng
Luke Luke REINSTATE MONICA

2
@Alex Hỗ trợ cho nhiều hệ điều hành hơn, nhưng phương pháp này đáng tin cậy hơn vì nó truy vấn trực tiếp các quyền được cung cấp cho phiên hiện tại thay vì không có tiêu cực kém tin cậy để suy ra tích cực.
Iszi

2
tuần, whoami / nhóm có một trường hợp cạnh mà bạn nhận được thông tin sai. Xem stackoverflow.com/questions/4051883/
Mạnh

1
@week whoamibị thiếu trên XP.
ivan_pozdeev

4

Rất nhiều câu trả lời cho câu hỏi này và nhiều câu hỏi khác trên SE ( 1 , 2 , 3 để đặt tên cho một số ít), tất cả đều thiếu theo cách này hay cách khác, đã cho thấy rõ rằng Windows không cung cấp tiện ích tích hợp đáng tin cậy . Vì vậy, đã đến lúc bạn tự tung ra.

Không có thêm bất kỳ hack bẩn:

Biên dịch chương trình sau (hướng dẫn theo) hoặc lấy bản sao được biên dịch trước . Điều này chỉ cần được thực hiện một lần, sau đó bạn có thể sao chép .exemọi nơi (ví dụ: cùng với Sysiternals Suite ).

Mã này hoạt động trong Win2k + 1 , cả có và không có UAC, tên miền, nhóm chuyển tiếp, bất cứ điều gì - bởi vì nó sử dụng cùng một cách với chính hệ thống khi kiểm tra quyền. chkadminin "Quản trị viên" hoặc "Không phải quản trị viên" và đặt mã thoát thành 0 hoặc 1, tương ứng. Đầu ra có thể bị triệt tiêu bằng công /qtắc.

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;
}

Để biên dịch, hãy chạy trong dấu nhắc lệnh Windows SDK:

cl /Ox chkadmin.c

(nếu sử dụng VS2012 +, cần điều chỉnh nhiều hơn nếu bạn cần nhắm mục tiêu 2k / XP )


Phương pháp này được cung cấp bởi /programming/4230602/detect-if-program-is-ricky-with-full-ad Administrator-rights / 4230908 # 4230908

1 MSDN tuyên bố các API là XP + nhưng điều này là sai. CheckTokenMembership là 2k + và một cái khác thậm chí còn cũ hơn .


3

Cách sạch nhất để kiểm tra các đặc quyền của quản trị viên bằng cách sử dụng tập lệnh CMD mà tôi đã tìm thấy là một cái gì đó như sau:

@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

Phương pháp này chỉ sử dụng các nội dung của CMD.exe, vì vậy nó sẽ rất nhanh. Nó cũng kiểm tra các khả năng thực tế của quy trình thay vì kiểm tra SID hoặc tư cách thành viên nhóm, vì vậy hiệu quả cho phép được kiểm tra. Và điều này hoạt động trở lại như Windows 2003 và XP. Các quy trình người dùng thông thường hoặc các quy trình không liên quan đều thất bại trong việc thăm dò thư mục, khi quá trình Quản trị viên hoặc nâng cao thành công.

Thử nghiệm này không thành công nếu Everyone, BUILTIN\Usersnhóm tương tự hoặc khác được đưa ra cho phép đọc để systemprofile. Cấp, đó là một cấu hình không chuẩn khác với các máy được định cấu hình như các bộ điều khiển miền Windows cung cấp quyền đọc / thực thi 'NT AUTHORITY \ Authenticated' cho systemprofile.


> xác minh XÁC MINH đã tắt. > xác minh /? Cho cmd.exe biết để xác minh rằng các tệp của bạn được ghi chính xác vào đĩa. XÁC MINH [ON | TẮT] Nhập XÁC MINH mà không có tham số để hiển thị cài đặt XÁC MINH hiện tại. Làm thế nào để lệnh này giúp kịch bản?
Luke Luke REINSTATE MONICA của Canada

3
@Canadian Luke, Một số lệnh lệnh tích hợp không xóa errorlevel nếu không có lỗi. Do đó, mọi người có thói quen xóa errorlevel bằng cách sử dụng các bản hack như verify. Tôi có xu hướng sử dụng cd .(dấu chấm không gian cd) đặt errorlevel thành 0, không tạo ra đầu ra và cũng hữu ích để tạo tệp có độ dài bằng không thông qua cd . >somefile. Điều đó nói rằng, tôi đã thử nghiệm 'dir' trên Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 và 10. Đối với tất cả các 'dir' đó sẽ xóa lỗi thành 0 nếu thành công trước khi nó được đặt trước 'dir'. Do đó, tôi không chắc tại sao william lại sử dụng 'xác minh' để xóa lỗi trước.
dùng3347790
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.