ตรวจสอบว่าพรอมต์คำสั่งปัจจุบันเปิดใช้งานในฐานะผู้ดูแลระบบหรือไม่


21

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



@ g-man มันเกี่ยวข้องอย่างไร?
ลุคชาวแคนาดาติดตั้ง MONICA ใหม่

นอกจากนี้ยังขอคำสั่งที่จะทำงานแตกต่างกันหากเรียกใช้ในฐานะผู้ดูแลระบบหรือไม่ - หรืออย่างน้อยก็มีคำสั่งเหล่านั้นเป็นคำตอบ
G-Man กล่าวว่า 'Reinstate Monica'

คำตอบ:


16

พบสิ่งนี้ใน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

สาเหตุที่ถูกลบคืออะไร
Canadian Luke ติดตั้งใหม่ MONICA

ทำงานได้ทั้งจากบัญชีผู้ดูแลระบบและเมื่อฉันเรียกใช้ในฐานะผู้ใช้ที่ จำกัด แต่เลือก 'เรียกใช้ในฐานะผู้ดูแลระบบ'
Canadian Luke ติดตั้งใหม่ MONICA

2
แนวคิดเดียวกัน แต่ใช้ตัวดำเนินการแบบมีเงื่อนไข: net session >nul 2>&1 && echo Success || echo Failure. ฉันพบว่ารูปแบบกะทัดรัดนี้สะดวกกว่า
dbenham

6
สิ่งนี้ต้องการบริการ "เซิร์ฟเวอร์" ที่จะใช้งาน
ivan_pozdeev

8

สิ่งนี้จะตรวจสอบระดับความสมบูรณ์สูง (ใช้ได้กับ Windows Vista และสูงกว่า)

@echo off

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

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

1
whoami ไม่ได้รับการสนับสนุนใน xp awnser ของฉันดีกว่ารองรับระบบปฏิบัติการทั้งหมดจาก windows xp ไปเป็น windows 8
อเล็กซ์

2
สิ่งนี้ใช้ได้ถ้าฉันเพิ่งเปิดพร้อมท์คำสั่ง ถ้าฉันเรียกใช้ CMD ในฐานะผู้ดูแลระบบก็ยังแสดงให้เห็นว่ามันทำงานเหมือนผู้ใช้
Canadian Luke ติดตั้ง MONICA ใหม่ใน

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

2
สัปดาห์ whoami / กลุ่มมีกรณีที่คุณได้รับข้อมูลที่ผิด ดูstackoverflow.com/questions/4051883/…
zumalifeguard

1
@week whoamiไม่มีอยู่ใน XP
ivan_pozdeev

4

หลายคำตอบมากมายสำหรับคำถามนี้และคำถามอื่น ๆ ใน 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;
}

ในการรวบรวมให้เรียกใช้ในพรอมต์คำสั่งของ Windows SDK:

cl /Ox chkadmin.c

(หากใช้ VS2012 + จะต้องมีการปรับเปลี่ยนเพิ่มเติมหากคุณต้องการกำหนดเป้าหมาย 2k / XP )


วิธีนี้เป็นมารยาทของ /programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908

1 MSDN อ้างว่า API เป็น XP + แต่นี่เป็นเท็จ CheckTokenMembership เป็น 2k +และอีกคนหนึ่งคือแม้เก่า


3

วิธีที่สะอาดที่สุดในการตรวจสอบสิทธิ์ผู้ดูแลระบบโดยใช้สคริปต์ CMD ที่ฉันได้พบนั้นเป็นดังนี้:

@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

วิธีนี้ใช้ตัวสร้าง CMD.exe เท่านั้นดังนั้นจึงควรเร็วมาก นอกจากนี้ยังตรวจสอบความสามารถที่แท้จริงของกระบวนการแทนที่จะตรวจสอบ SID หรือการเป็นสมาชิกกลุ่มดังนั้นทดสอบการอนุญาตที่มีประสิทธิภาพ และใช้งานได้นานเท่า Windows 2003 และ XP กระบวนการผู้ใช้ปกติหรือกระบวนการที่ไม่เกี่ยวข้องจะล้มเหลวในการตรวจสอบไดเรกทอรีโดยที่ Admin หรือกระบวนการที่ได้รับการยกระดับประสบความสำเร็จ

การทดสอบนี้จะล้มเหลวหากEveryone, BUILTIN\Usersหรือกลุ่มอื่นที่คล้ายคลึงกันจะได้รับสิทธิ์ในการอ่านเพื่อ systemprofile ได้รับนั่นคือการกำหนดค่าที่ไม่ได้มาตรฐานนอกเหนือจากบนเครื่องที่กำหนดค่าเป็นตัวควบคุมโดเมน Windows ซึ่งให้สิทธิ์การอ่าน / ดำเนินการ 'NT AUTHORITY \ Authentated Users' ให้กับ systemprofile


> ตรวจสอบว่า VERIFY ปิดอยู่ > ยืนยัน /? บอก cmd.exe ว่าจะตรวจสอบว่าไฟล์ของคุณเขียนอย่างถูกต้องไปยังดิสก์หรือไม่ ตรวจสอบ [ON | OFF] พิมพ์ VERIFY โดยไม่มีพารามิเตอร์เพื่อแสดงการตั้งค่า VERIFY ปัจจุบัน คำสั่งนี้ช่วยสคริปต์ได้อย่างไร
ลุคแคนาดาติดตั้งใหม่ MONICA

3
@Canadian Luke, คำสั่งในตัวบางคำสั่งไม่ลบข้อผิดพลาดระดับหากไม่มีข้อผิดพลาด ดังนั้นคนที่ได้เป็นนิสัยของการล้าง errorlevel โดยใช้ hacks verifyเช่น ฉันมักจะใช้cd .(CD พื้นที่ dot) ซึ่งกำหนด errorlevel 0, cd . >somefileผลิตออกไม่ได้และยังเป็นประโยชน์สำหรับการสร้างไฟล์ความยาวเป็นศูนย์ผ่าน ที่กล่าวว่าฉันทดสอบ 'dir' ใน Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 และ 10 สำหรับผู้ที่ 'dir' ทั้งหมดจะล้าง errorlevel เป็น 0 เมื่อสำเร็จถ้าตั้งไว้ก่อน 'dir' ดังนั้นฉันไม่แน่ใจว่าทำไมวิลเลียมใช้ 'ยืนยัน' เพื่อแก้ไขข้อผิดพลาดระดับแรก
user3347790
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.