จะตรวจสอบได้อย่างไรว่า CMD ทำงานในฐานะผู้ดูแลระบบ / มีการยกระดับสิทธิ์หรือไม่?


106

จากภายในไฟล์แบตช์ฉันต้องการทดสอบว่าฉันใช้งานด้วยสิทธิ์ระดับผู้ดูแลระบบ / ระดับสูงหรือไม่

ชื่อผู้ใช้จะไม่เปลี่ยนแปลงเมื่อเลือก "Run as Administrator" ดังนั้นจึงไม่ได้ผล

หากมีคำสั่งที่ใช้ได้ทั่วไปซึ่งไม่มีผล แต่ต้องใช้สิทธิ์ระดับผู้ดูแลระบบฉันสามารถเรียกใช้และตรวจสอบรหัสข้อผิดพลาดเพื่อทดสอบสิทธิ์ได้ จนถึงตอนนี้ฉันยังไม่พบคำสั่งดังกล่าว คำสั่งที่ฉันพบดูเหมือนจะส่งคืนรหัสข้อผิดพลาดเดียวที่ไม่เฉพาะเจาะจงซึ่งอาจบ่งชี้อะไรก็ได้และมักจะล้มเหลวด้วยเหตุผลหลายประการ

ฉันสนใจเฉพาะ Windows 7 เท่านั้นแม้ว่าการสนับสนุนระบบปฏิบัติการรุ่นก่อนหน้าจะดี


การแฮ็กหนึ่งครั้งจะพยายามทำecho > somefileในไดเร็กทอรีที่ต้องการสิทธิ์ผู้ดูแลระบบ มันจะสร้างไฟล์เป็นผลข้างเคียง แต่คุณสามารถตรวจสอบการชนกันและสร้างชื่อไฟล์ที่ไม่ซ้ำกันเพื่อเป็นวิธีแก้ปัญหา
Marc B


1
[คุณสามารถค้นหาชุดการยกระดับตัวเองได้ที่นี่] [1] [1]: stackoverflow.com/questions/4051883/…
Amr Ali


1
@npocmaka คำถามที่คุณเชื่อมโยงนั้นซ้ำกับคำถามนี้จริงๆ;) (2013 กับ 2011)
Matthieu

คำตอบ:


63

ADDENDUM : สำหรับ Windows 8 สิ่งนี้จะไม่ทำงาน ดูคำตอบที่ยอดเยี่ยมนี้แทน


พบโซลูชันนี้ที่นี่: 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
)

สมมติว่าไม่ได้ผลและเนื่องจากเรากำลังพูดถึง Win7 คุณสามารถใช้สิ่งต่อไปนี้ใน Powershell ได้หากเหมาะสม:

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

ถ้าไม่ (และอาจไม่ใช่เนื่องจากคุณเสนอไฟล์แบตช์อย่างชัดเจน) คุณสามารถเขียนข้างต้นใน. NET และส่งคืนรหัสออกจาก exe ตามผลลัพธ์สำหรับไฟล์แบตช์ของคุณที่จะใช้


4
คำสั่ง AT นั้นสมบูรณ์แบบ! Google-fu ของคุณเหนือกว่า Google-fu ของฉัน ;-)
เจฟฟ์

2
+1 @Rushyo ฉันขยายการแก้ปัญหาของคุณเล็กน้อยและโพสต์ไว้ที่นี่เนื่องจากนั่นเป็นสิ่งที่ฉันเจอในตอนแรก ขอบคุณ! stackoverflow.com/questions/4051883/…
blak3r

16
ATไม่ทำงานบน Windows 8 แต่ฉันพบวิธีแก้ปัญหาที่ดีกว่า ฉันได้โพสต์ไว้เป็นคำตอบสำหรับคำถามอื่นที่นี่: stackoverflow.com/questions/4051883/… .
Mythofechelon

4
ฉันแนะนำ whoami / กลุ่ม | findstr / b BUILTIN \ Admin | findstr / c: "กลุ่มที่เปิดใช้งาน" && echo "ฉันมีผู้ดูแลระบบ!" - ทำงานบน 95, 98, 2000, xp, vista, 7, 8! (จากความคิดเห็น "ฉันชอบการใช้ AT ... " ของ
Rushyo

1
ฉันชอบที่pingจะแทนที่หายไปsleep:)
Matthieu

100

เคล็ดลับนี้ต้องการเพียงคำสั่งเดียว: พิมพ์net sessionลงในพรอมต์คำสั่ง

หากคุณไม่ใช่ผู้ดูแลระบบคุณจะได้รับข้อความปฏิเสธการเข้าถึง

System error 5 has occurred.

Access is denied.

หากคุณเป็นผู้ดูแลระบบคุณจะได้รับข้อความที่แตกต่างกันโดยทั่วไปคือ:

There are no entries in the list.

จากMS Technet :

ใช้โดยไม่มีพารามิเตอร์เซสชันสุทธิจะแสดงข้อมูลเกี่ยวกับเซสชันทั้งหมดด้วยเครื่องคอมพิวเตอร์


นั่นเป็นหน้าที่เหมือนกับคำตอบของ Rushyo ซึ่งใช้คำสั่ง AT
เจฟฟ์

13
ใน Windows 8.1 สิ่งนี้เป็นที่ต้องการสำหรับ AT เนื่องจาก AT เลิกใช้งานแล้ว การใช้คำตอบของ Rushyo แต่การแทนที่ATด้วยเซสชันสุทธิหรือเซสชัน net.exeทำงานได้ดีสำหรับฉัน
kayleeFrye_onDeck

นี่เป็นวิธีที่ง่ายที่สุดในการดำเนินการนี้ในพรอมต์คำสั่ง (ซึ่งแตกต่างจากไฟล์แบตช์)
enderland

2
เพียงแค่พิมพ์There are no entries in the list.ใน Windows 10 Pro
gman

1
ในไฟล์แบตช์ให้ใช้อะไรแบบนั้น:net session >nul 2>&1 || (echo not admin&goto :eof)
anilech

27

ฉันชอบคำแนะนำของ Rushyo ในการใช้ AT แต่นี่เป็นอีกทางเลือกหนึ่ง:

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

วิธีนี้ยังช่วยให้คุณแยกความแตกต่างระหว่างผู้ดูแลระบบที่ไม่ใช่ผู้ดูแลระบบและผู้ดูแลระบบที่ไม่ได้รับการยกระดับได้หากคุณต้องการ ผู้ดูแลระบบที่ไม่ได้รับการยกระดับยังคงมี BUILTIN \ Administrators ในรายการกลุ่ม แต่ไม่ได้เปิดใช้งาน

อย่างไรก็ตามสิ่งนี้จะใช้ไม่ได้กับระบบที่ไม่ใช่ภาษาอังกฤษบางระบบ ให้ลอง

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

(สิ่งนี้ควรใช้กับ Windows 7 แต่ฉันไม่แน่ใจเกี่ยวกับเวอร์ชันก่อนหน้านี้)


1
ในเวอร์ชั่นภาษาโปแลนด์ฉันมี: BUILTIN \ Administratorzy ดังนั้นฉันขอแนะนำ: whoami / groups | findstr / b BUILTIN \ Admin | findstr / c: "Enabled group" && goto: isadministrator
barwnikk

@barwnikk ฉันขอแนะนำwhoami/groupsจากนั้นสแกนเส้นด้วยตนเอง คงใช้เวลาไม่นานนักและคำสั่งก็อยู่ในสมองของคุณ
Pacerier

@Pacerier: จุดของคำถามคือการตรวจสอบระดับความสูงในไฟล์ชุด หากบุคคลอยู่ที่บรรทัดคำสั่งสิ่งที่พวกเขาต้องทำคือดูที่ชื่อหน้าต่างซึ่งจะเริ่ม "Administrator:" เสมอหากคุณอยู่ในระดับสูง
Harry Johnston

@HarryJohnston ว้าวไม่ได้ตระหนักถึงสิ่งนั้น หัวข้อ "Administrator" ปรากฏขึ้นสำหรับทุกเวอร์ชันของ Windows หรือไม่
Pacerier

@Pacerier: เวอร์ชันปัจจุบันทั้งหมด (Vista เป็นต้นไป)
Harry Johnston

26

สิ่งที่คนอื่นใส่ไว้ก่อนหน้านี้ค่อนข้างมาก แต่เป็นซับเดียวที่สามารถใส่ไว้ที่จุดเริ่มต้นของคำสั่งแบทช์ (ปกติแล้วหลังจาก @echo off)

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

2
นี่เป็นเวอร์ชันล่าสุดและซ่อนเอาต์พุตที่ไม่เกี่ยวข้องจาก net.exe อย่างดี
andersand

2
ทำงานได้ดีบน Windows 10
James Pack

ใช้งานได้ดีเพียงแค่ปรับส่วนท้ายของ & Timeout / t 10 & Exit / b 1) เพื่อให้ในไฟล์แบตช์หน้าต่างจะไม่หายไปทันที
WhoIsRich

12

วิธีที่ง่ายที่สุดใน Vista, Win 7 ขึ้นไปคือการแจกแจงกลุ่มโทเค็นและมองหาระดับความสมบูรณ์ในปัจจุบัน (หรือผู้ดูแลระบบถ้าเฉพาะการเป็นสมาชิกกลุ่มเท่านั้นที่สำคัญ)

ตรวจสอบว่าเรากำลังยกระดับ:

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

ตรวจสอบว่าเราเป็นของผู้ดูแลระบบท้องถิ่นหรือไม่:

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

ตรวจสอบว่าเราเป็นของผู้ดูแลโดเมนหรือไม่:

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

บทความต่อไปนี้แสดงรายการระดับความสมบูรณ์ของหน้าต่าง SIDs ที่ใช้: http://msdn.microsoft.com/en-us/library/bb625963.aspx


whoami / groups มีขอบกรณีที่คุณได้รับข้อมูลที่ไม่ถูกต้อง ดูstackoverflow.com/questions/4051883/…
zumalifeguard

7

นี่คือคำตอบของแฮร์รี่ที่ปรับเปลี่ยนเล็กน้อยที่เน้นไปที่สถานะที่สูงขึ้น ฉันใช้สิ่งนี้เมื่อเริ่มต้นไฟล์ 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
)

สิ่งนี้ใช้ได้ผลสำหรับฉันอย่างแน่นอนและหลักการก็ดูเหมือนจะดี จากChris JacksonจากMSFT :

เมื่อคุณกำลังทำงานในระดับสูงโทเค็นของคุณจะมี ACE ที่เรียกว่าระดับบังคับบังคับระดับสูง


whoami / groups มีขอบกรณีที่คุณได้รับข้อมูลที่ไม่ถูกต้อง ดูstackoverflow.com/questions/4051883/…
zumalifeguard

7

การแก้ไขปัญหา:

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

ไม่ทำงานภายใต้ Windows 10

สำหรับ Windows ทุกรุ่นสามารถทำได้:

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

6

ฉันอ่านคำตอบ (ส่วนใหญ่?) จำนวนมากจากนั้นพัฒนาไฟล์ bat ที่เหมาะกับฉันใน Win 8.1 คิดว่าฉันจะแบ่งปัน

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

หวังว่าจะมีคนพบว่าสิ่งนี้มีประโยชน์ :)


whoami / groups มีขอบกรณีที่คุณได้รับข้อมูลที่ไม่ถูกต้อง ดูstackoverflow.com/questions/4051883/…
zumalifeguard

ขอบคุณสำหรับสิ่งนี้! โซลูชัน "whoami" อื่น ๆ ไม่ได้ผลสำหรับฉันใน Windows 8.1 อันนี้ทำ
Ryan


1

ฉันรู้ว่าฉันมาสายปาร์ตี้นี้จริงๆ แต่นี่คือซับหนึ่งของฉันที่จะตัดสินผู้ดูแลระบบ

ไม่ได้ขึ้นอยู่กับระดับข้อผิดพลาดเพียงแค่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%)

มันจะส่งคืนใช่หรือไม่ใช่ขึ้นอยู่กับสถานะผู้ดูแลระบบของผู้ใช้ ...

นอกจากนี้ยังกำหนดค่าของตัวแปร "admin" ให้เท่ากับใช่หรือไม่ใช่ตามนั้น


สิ่งนี้จะใช้ได้เฉพาะในกรณีที่ผู้ใช้เป็นสมาชิกโดยตรงของกลุ่มผู้ดูแลระบบภายใน หากผู้ใช้เป็นสมาชิกของกลุ่มโดเมน (เช่น "ผู้ดูแลระบบโดเมน") ซึ่งเป็นสมาชิกของกลุ่มผู้ดูแลระบบจะใช้ไม่ได้
Harry Johnston

1

หากคุณกำลังเรียกใช้ในฐานะผู้ใช้ที่มีสิทธิ์ผู้ดูแลระบบ SessionName ตัวแปรสภาพแวดล้อมจะไม่ถูกกำหนดและคุณยังไม่มีสิทธิ์ของผู้ดูแลระบบเมื่อเรียกใช้ไฟล์แบตช์

คุณควรใช้คำสั่ง "net session" และค้นหารหัสส่งคืนข้อผิดพลาดเป็น "0" เพื่อตรวจสอบสิทธิ์ของผู้ดูแลระบบ

ตัวอย่าง; - คำสั่งก้องแรกคืออักขระระฆัง 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

นี่เป็นวิธีง่ายๆที่ฉันเคยใช้ใน Windows 7 ถึง Windows 10 โดยทั่วไปฉันใช้คำสั่ง "IF EXIST" เพื่อตรวจสอบโฟลเดอร์ Windows \ System32 \ WDI \ LogFiles โฟลเดอร์ WDI มีอยู่ในทุกการติดตั้ง Windows ตั้งแต่อย่างน้อย 7 เป็นต้นไปและต้องมีสิทธิ์ของผู้ดูแลระบบในการเข้าถึง โฟลเดอร์ WDI จะมีโฟลเดอร์ LogFiles อยู่ข้างในเสมอ ดังนั้นการเรียกใช้ "IF EXIST" ในโฟลเดอร์ WDI \ LogFiles จะคืนค่าจริงหากรันในฐานะผู้ดูแลระบบและเป็นเท็จหากไม่ได้เรียกใช้ในฐานะผู้ดูแลระบบ สิ่งนี้สามารถใช้ในไฟล์แบตช์เพื่อตรวจสอบระดับสิทธิ์และขยายสาขาไปยังคำสั่งใดก็ได้ที่คุณต้องการตามผลลัพธ์นั้น

นี่คือตัวอย่างโค้ดสั้น ๆ :

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

:GOTADMIN
(Commands for running with admin privileges)

โปรดทราบว่าวิธีนี้ถือว่าสิทธิ์การรักษาความปลอดภัยเริ่มต้นไม่ได้ถูกแก้ไขในโฟลเดอร์ WDI (ซึ่งไม่น่าจะเกิดขึ้นในสถานการณ์ส่วนใหญ่ แต่โปรดดูข้อแม้ # 2 ด้านล่าง) แม้ว่าในกรณีนั้นจะเป็นเพียงเรื่องของการแก้ไขโค้ดเพื่อตรวจสอบไฟล์ / โฟลเดอร์ทั่วไปอื่นที่ต้องการการเข้าถึงของผู้ดูแลระบบ (System32 \ config \ SAM อาจเป็นตัวเลือกอื่นที่ดี) หรือคุณสามารถสร้างของคุณเองโดยเฉพาะสำหรับสิ่งนั้น วัตถุประสงค์.

มีข้อแม้สองประการเกี่ยวกับวิธีนี้:

  1. การปิดใช้งาน UAC มีแนวโน้มที่จะทำลายความจริงง่ายๆที่ว่าทุกอย่างจะถูกเรียกใช้ในฐานะผู้ดูแลระบบ

  2. การพยายามเปิดโฟลเดอร์ WDI ใน Windows Explorer จากนั้นคลิก "ดำเนินการต่อ" เมื่อได้รับแจ้งจะเป็นการเพิ่มสิทธิ์การเข้าถึงถาวรสำหรับบัญชีผู้ใช้นั้นซึ่งจะทำลายวิธีการของฉัน หากสิ่งนี้เกิดขึ้นสามารถแก้ไขได้โดยการลบบัญชีผู้ใช้ออกจากสิทธิ์การรักษาความปลอดภัยของโฟลเดอร์ WDI หากด้วยเหตุผลใดก็ตามผู้ใช้ต้องสามารถเข้าถึงโฟลเดอร์ WDI ด้วย Windows Explorer ได้คุณจะต้องแก้ไขรหัสเพื่อตรวจสอบโฟลเดอร์อื่น (ดังที่กล่าวไว้ข้างต้นการสร้างของคุณเองโดยเฉพาะเพื่อจุดประสงค์นี้อาจเป็นทางเลือกที่ดี) .

ดังนั้นเป็นที่ยอมรับว่าวิธีการของฉันไม่สมบูรณ์แบบเนื่องจากอาจเสียได้ แต่เป็นวิธีที่ค่อนข้างรวดเร็วที่ใช้งานง่ายเข้ากันได้กับ Windows 7, 8 และ 10 ทุกเวอร์ชันและหากฉันคำนึงถึงข้อควรระวังที่กล่าวถึง ได้ผล 100% สำหรับฉัน


0

ใช้ได้กับ Win7 Enterprise และ Win10 Enterprise

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.