Làm thế nào để phát hiện nếu CMD đang chạy với tư cách Quản trị viên / có các đặc quyền nâng cao?


101

Từ bên trong tệp hàng loạt, tôi muốn kiểm tra xem liệu tôi có đang chạy với đặc quyền Quản trị viên / nâng cao hay không.

Tên người dùng không thay đổi khi "Chạy với tư cách quản trị viên" được chọn, vì vậy điều đó không hoạt động.

Nếu có một lệnh phổ biến, không có hiệu lực nhưng yêu cầu đặc quyền quản trị, thì tôi có thể chạy lệnh đó và kiểm tra mã lỗi để kiểm tra đặc quyền. Cho đến nay, tôi đã không tìm thấy một lệnh như vậy. Các lệnh tôi đã tìm thấy dường như trả về một mã lỗi duy nhất, không cụ thể, có thể chỉ ra bất kỳ điều gì và chúng dễ bị lỗi vì nhiều lý do.

Tôi chỉ quan tâm đến Windows 7, mặc dù hỗ trợ các hệ điều hành trước đó sẽ rất tốt.


Một cuộc tấn công sẽ được cố gắng thực hiện echo > somefilevào một thư mục yêu cầu quyền quản trị viên. nó sẽ tạo ra một tệp như một tác động phụ, nhưng bạn có thể kiểm tra các xung đột và tạo một tên tệp duy nhất như một giải pháp thay thế.
Marc B


1
[bạn có thể tìm thấy một đợt tự nâng cấp tại đây] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali


1
@npocmaka câu hỏi bạn đã liên kết thực sự là bản sao của câu hỏi này;) (2013 so với 2011)
Matthieu

Câu trả lời:


62

ADDENDUM : Đối với Windows 8, điều này sẽ không hoạt động; thay vào đó hãy xem câu trả lời xuất sắc này .


Tìm thấy giải pháp này tại đây: http://www.robvanderwoude.com/clevertricks.php

AT > NUL
IF %ERRORLEVEL% EQU 0 (
    ECHO you are Administrator
) ELSE (
    ECHO you are NOT Administrator. Exiting...
    PING 127.0.0.1 > NUL 2>&1
    EXIT /B 1
)

Giả sử điều đó không hoạt động và vì chúng ta đang nói về Win7, bạn có thể sử dụng những thứ sau trong Powershell nếu phù hợp:

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

Nếu không (và có thể là không, vì bạn đã đề xuất tệp lô một cách rõ ràng) thì bạn có thể viết như trên trong .NET và trả về mã thoát từ exe dựa trên kết quả cho tệp lô của bạn để sử dụng.


4
Lệnh AT là hoàn hảo! Google-fu của bạn vượt trội hơn Google-fu của tôi. ;-)
Jeff

2
+1 @Rushyo, tôi đã mở rộng giải pháp của bạn một chút và đăng nó ở đây vì đó là giải pháp ban đầu tôi đã xem qua. Cảm ơn! stackoverflow.com/questions/4051883/…
blak3r

16
ATkhông hoạt động trên Windows 8, nhưng tôi đã tìm thấy một giải pháp tốt hơn. Tôi đã đăng nó như một câu trả lời cho một câu hỏi khác, tại đây: stackoverflow.com/questions/4051883/… .
mythofechelon,

4
Tôi giới thiệu whoami / nhóm | findstr / b BUILTIN \ Admin | findstr / c: "Nhóm đã bật" && echo "Tôi có quản trị viên!" - làm việc trên 95, 98, 2000, xp, vista, 7, 8! (Từ nhận xét "Tôi thích Rushyo không biết sử dụng AT ...")
barwnikk

1
Tôi thích pingđể thay thế thiếu sleep:)
Matthieu

96

Thủ thuật này chỉ yêu cầu một lệnh: gõ net session vào dấu nhắc lệnh.

Nếu bạn KHÔNG phải là quản trị viên , bạn có quyền truy cập bị từ chối thông báo.

System error 5 has occurred.

Access is denied.

Nếu bạn là quản trị viên , bạn sẽ nhận được một thông báo khác, thông báo phổ biến nhất:

There are no entries in the list.

Từ MS Technet :

Được sử dụng mà không có tham số, phiên net hiển thị thông tin về tất cả các phiên với máy tính cục bộ.


Về mặt chức năng, câu trả lời của Rushyo đã sử dụng lệnh AT.
Jeff

12
Trên Windows 8.1, điều này được ưu tiên cho AT, vì AT không được dùng nữa. Sử dụng câu trả lời của Rushyo nhưng thay thế AT bằng phiên net hoặc phiên net.exe hoạt động hoàn hảo đối với tôi.
kayleeFrye_onDeck

Đây có vẻ là cách dễ nhất để thực hiện việc này trên dấu nhắc lệnh (tuy nhiên, khác với tệp hàng loạt).
enderland

2
In ra chỉ There are no entries in the list.trong Windows 10 Pro
GMAN

1
trong một cái gì đó sử dụng tập tin thực thi như thế:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech

27

Tôi thích đề xuất sử dụng AT của Rushyo, nhưng đây là một lựa chọn khác:

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

Cách tiếp cận này cũng sẽ cho phép bạn phân biệt giữa quản trị viên không phải quản trị viên và quản trị viên không cấp cao nếu bạn muốn. Quản trị viên không được nâng cao vẫn có BUILTIN \ Quản trị viên trong danh sách nhóm nhưng nó không được bật.

Tuy nhiên, điều này sẽ không hoạt động trên một số hệ thống ngôn ngữ không phải tiếng Anh. Thay vào đó, hãy thử

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(Điều này sẽ hoạt động trên Windows 7 nhưng tôi không chắc về các phiên bản trước đó.)


1
Trong phiên bản đánh bóng, tôi có: BUILTIN \ Administratorzy, vì vậy, tôi khuyên bạn nên: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Đã bật nhóm" && goto: isadministrator
barwnikk

@barwnikk, tôi đề xuất whoami/groupsvà sau đó quét các dòng theo cách thủ công. Sẽ không mất quá nhiều thời gian và lệnh phù hợp với bộ não của bạn.
Pacerier

@Pacerier: điểm của câu hỏi là phát hiện độ cao trong một tệp hàng loạt . Nếu một người đang ở dòng lệnh, tất cả những gì họ cần làm là nhìn vào tiêu đề cửa sổ, tiêu đề này luôn bắt đầu "Quản trị viên:" nếu bạn được nâng cao.
Harry Johnston

@HarryJohnston, Wow đã không nhận ra điều đó. Tiêu đề "Quản trị viên" có xuất hiện cho tất cả các phiên bản windows không?
Pacerier

@Pacerier: tất cả các phiên bản hiện tại (Vista trở đi).
Harry Johnston

24

Khá nhiều thứ mà những người khác đã đặt trước đây, nhưng như một lớp lót duy nhất có thể được đặt ở đầu lệnh hàng loạt. (Chà, thường là sau khi @echo tắt.)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)

2
Đây là phiên bản cập nhật và nó ẩn đầu ra không liên quan từ net.exe một cách độc đáo
anders và

2
Hoạt động tốt trên Windows 10.
James Pack

Hoạt động tuyệt vời, chỉ cần chỉnh sửa kết thúc thành & Timeout / t 10 & Exit / b 1) để trong một tệp hàng loạt, cửa sổ không biến mất ngay lập tức.
WhoIsRich

12

Cách dễ nhất để thực hiện việc này trên Vista, Win 7 trở lên là liệt kê các nhóm mã thông báo và tìm kiếm mức toàn vẹn hiện tại (hoặc sid quản trị viên, nếu chỉ tư cách thành viên nhóm là quan trọng):

Kiểm tra xem chúng tôi có đang chạy nâng cao không:

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

Kiểm tra xem chúng tôi có thuộc về quản trị viên địa phương hay không:

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

Kiểm tra xem chúng tôi có thuộc quản trị viên miền không:

whoami /groups | find "-512 " && Echo I am a domain admin

Bài viết sau liệt kê các cửa sổ SID cấp độ toàn vẹn sử dụng: http://msdn.microsoft.com/en-us/library/bb625963.aspx


whoami / groups có một trường hợp nguy hiểm là bạn nhận được thông tin sai. Xem stackoverflow.com/questions/4051883/…
zumalifeguard

7

Đây là một sửa đổi nhỏ trong câu trả lời của Harry tập trung vào trạng thái được nâng cao; Tôi đang sử dụng cái này khi bắt đầu tệp install.bat:

set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
    echo You must run the command prompt as administrator to install.
    exit /b 1
)

Điều này chắc chắn đã làm việc cho tôi và nguyên tắc dường như là đúng đắn; từ Chris Jackson của MSFT :

Khi bạn đang chạy ở mức cao, mã thông báo của bạn chứa ACE được gọi là Nhãn bắt buộc \ Mức bắt buộc cao.


whoami / groups có một trường hợp nguy hiểm là bạn nhận được thông tin sai. Xem stackoverflow.com/questions/4051883/…
zumalifeguard

7

giải pháp:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

không hoạt động trong Windows 10

cho tất cả các phiên bản của Windows có thể làm như vậy:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

6

Tôi đã đọc nhiều (hầu hết?) Câu trả lời, sau đó phát triển một tệp bat hoạt động cho tôi trong Win 8.1. Tôi nghĩ tôi sẽ chia sẻ nó.

setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
  echo Do user stuff...
  goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
  echo Do admin stuff...
  goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
  echo Do admin stuff...
  goto end
:notSystem
echo Do common stuff...
:end

Hy vọng ai đó thấy điều này hữu ích :)


whoami / groups có một trường hợp nguy hiểm là bạn nhận được thông tin sai. Xem stackoverflow.com/questions/4051883/…
zumalifeguard

Cảm ơn vì điều này! Giải pháp "whoami" khác không hoạt động với tôi trên Windows 8.1. Điều này đã làm.
Ryan


1

Tôi biết mình thực sự đến muộn với bữa tiệc này, nhưng đây là một trong những điều tôi cần biết để xác định quản trị viên.

Nó không dựa vào mức độ lỗi, chỉ dựa vào systeminfo:

for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)

Nó trả về có hoặc không, tùy thuộc vào trạng thái quản trị của người dùng ...

Nó cũng đặt giá trị của biến "admin" bằng có hoặc không tương ứng.


Điều này sẽ chỉ hoạt động nếu người dùng là thành viên trực tiếp của nhóm cục bộ Quản trị viên. Nếu người dùng là thành viên của nhóm miền (ví dụ: "Quản trị viên miền") là thành viên của nhóm Quản trị viên, thì nó sẽ không hoạt động.
Harry Johnston

1

Nếu bạn đang chạy với tư cách người dùng có quyền quản trị viên thì biến môi trường SessionName sẽ KHÔNG được xác định và bạn vẫn không có quyền quản trị viên khi chạy một tệp hàng loạt.

Bạn nên sử dụng lệnh "net session" và tìm mã trả về lỗi "0" để xác minh quyền quản trị viên.

Thí dụ; - câu lệnh echo đầu tiên là ký tự chuông net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)


0

Đây là một phương pháp đơn giản tôi đã sử dụng trên Windows 7 đến Windows 10. Về cơ bản, tôi chỉ cần sử dụng lệnh "IF EXIST" để kiểm tra thư mục Windows \ System32 \ WDI \ LogFiles. Thư mục WDI tồn tại trên mọi bản cài đặt Windows từ ít nhất 7 trở đi và nó yêu cầu đặc quyền quản trị viên để truy cập. Thư mục WDI luôn có thư mục LogFiles bên trong nó. Vì vậy, chạy "IF EXIST" trên thư mục WDI \ LogFiles sẽ trả về true nếu chạy với tư cách quản trị viên và false nếu không chạy với tư cách quản trị viên. Điều này có thể được sử dụng trong một tệp hàng loạt để kiểm tra mức đặc quyền và phân nhánh cho bất kỳ lệnh nào bạn muốn dựa trên kết quả đó.

Đây là một đoạn mã ví dụ ngắn gọn:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

Hãy nhớ rằng phương pháp này giả định các quyền bảo mật mặc định chưa được sửa đổi trên thư mục WDI (điều này khó có thể xảy ra trong hầu hết các trường hợp, nhưng vui lòng xem cảnh báo # 2 bên dưới). Ngay cả trong trường hợp đó, nó chỉ đơn giản là sửa đổi mã để kiểm tra một tệp / thư mục chung khác yêu cầu quyền truy cập quản trị (System32 \ config \ SAM có thể là một ứng cử viên thay thế tốt) hoặc bạn thậm chí có thể tạo riêng của mình cho điều đó mục đích.

Tuy nhiên, có hai lưu ý về phương pháp này:

  1. Vô hiệu hóa UAC có thể sẽ phá vỡ thực tế đơn giản rằng mọi thứ sẽ được chạy với tư cách quản trị viên.

  2. Việc cố gắng mở thư mục WDI trong Windows Explorer và sau đó nhấp vào "Tiếp tục" khi được nhắc sẽ thêm quyền truy cập vĩnh viễn cho tài khoản người dùng đó, do đó phá vỡ phương pháp của tôi. Nếu điều này xảy ra, nó có thể được khắc phục bằng cách xóa tài khoản người dùng khỏi quyền bảo mật thư mục WDI. Nếu vì bất kỳ lý do gì mà người dùng PHẢI có thể truy cập vào thư mục WDI bằng Windows Explorer, thì bạn phải sửa đổi mã để kiểm tra một thư mục khác (như đã đề cập ở trên, việc tạo riêng của bạn cho mục đích này có thể là một lựa chọn tốt) .

Vì vậy, phải thừa nhận rằng phương pháp của tôi không hoàn hảo vì nó có thể bị hỏng, nhưng đó là một phương pháp tương đối nhanh, dễ thực hiện, tương thích như nhau với tất cả các phiên bản Windows 7, 8 và 10 và miễn là tôi lưu ý đến những lưu ý đã đề cập. 100% hiệu quả đối với tôi.


0

Hoạt động cho Win7 Enterprise và Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
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.