जांचें कि क्या वर्तमान कमांड प्रॉम्प्ट को प्रशासक के रूप में लॉन्च किया गया था


21

मैं एक स्क्रिप्ट लिखने के लिए देख रहा हूं जो उपयोगकर्ता इनपुट लेता है, फिर सिस्टम में व्यापक बदलाव करता है। मुझे यह बहुत सामान्य होने की आवश्यकता है, लेकिन सीधे शब्दों में कहें, तो मुझे यह देखने की जरूरत है कि क्या यह 'एक प्रशासक' के रूप में चलाया जा रहा है। यदि यह नहीं है, तो मैं उन्हें बताने के लिए एक संदेश प्रदर्शित करना चाहता हूं; अगर यह है, तो मैं चाहता हूं कि यह जारी रहे। क्या इसे सत्यापित करने का कोई निरंतर तरीका है? मैं प्रशासक के रूप में एक नया सत्र शुरू करना नहीं चाह रहा हूं, मैं केवल यह पता लगाना चाहता हूं कि क्या यह वर्तमान में व्यवस्थापक के रूप में चलाया जाता है



@ जी-आदमी यह कैसे संबंधित है?
कनाडाई ल्यूक पुनर्जीवित मोनाका

यह उन आदेशों के लिए भी पूछ रहा है जो व्यवस्थापक के रूप में चलने पर अलग-अलग व्यवहार करेंगे या नहीं - या कम से कम उन लोगों को जवाब के रूप में मिला।
जी-मैन का कहना है कि 'मोनिका' बहाल

जवाबों:


16

स्टैक ओवरफ्लो पर यह मिला :

@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

इसे हटाने का क्या कारण था?
कनाडाई ल्यूक ने 10

यह काम करता है, दोनों प्रशासक खाते से, और जब मैं एक सीमित उपयोगकर्ता के रूप में दौड़ता हूं, लेकिन 'Run as Administrator' चुनें
कनाडाई ल्यूक पुनर्निर्मित MONICA

2
एक ही विचार है, लेकिन सशर्त निष्पादन ऑपरेटरों का उपयोग करना net session >nul 2>&1 && echo Success || echo Failure:। मुझे यह कॉम्पैक्ट सिंटैक्स अधिक सुविधाजनक लगता है।
डेनबैम

6
इसके लिए "सर्वर" सेवा को चलाना आवश्यक है।
ivan_pozdeev 8

8

यह उच्च अखंडता स्तर के लिए जाँच करता है। (विंडोज विस्टा और उच्चतर के लिए काम करता है)

@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 बेहतर है विंडोज़ से विंडोज़ 8 तक सभी ओएस का समर्थन करता है
एलेक्स

2
यह काम करता है अगर मैं सिर्फ कमांड प्रॉम्प्ट खोलता हूं। अगर मैं CMD को प्रशासक के रूप में चलाता हूं, तो यह अभी भी दिखाता है कि यह एक उपयोगकर्ता के रूप में चलाया जाता है
कनाडाई ल्यूक पुनर्निर्मित MONICA

2
अधिक ओएस के लिए @Alex समर्थन बहुत अच्छा है, लेकिन यह विधि अधिक विश्वसनीय है क्योंकि यह सीधे सकारात्मक सत्र को कम करने के लिए कम-विश्वसनीय नकारात्मक की अनुपस्थिति लेने के बजाय वर्तमान सत्र को दी गई अनुमतियों पर सवाल उठाता है।
इज़ी

2
सप्ताह, whoami / समूहों में एक किनारा मामला है जहां आपको गलत जानकारी मिलती है। देखें stackoverflow.com/questions/4051883/...
zumalifeguard

1
@week whoamiXP में गायब है।
ivan_pozdeev 8

4

इस पर कई (एसई ( 1 , 2 , 3 कुछ नाम करने के लिए) और कई अन्य सवालों के जवाब , जिनमें से सभी इस तरह से या किसी अन्य की कमी हैं, ने स्पष्ट रूप से दिखाया है कि विंडोज एक विश्वसनीय अंतर्निहित उपयोगिता प्रदान नहीं करता है । तो, यह अपना खुद का रोल करने का समय है।

बिना किसी और गंदे हैक के:

निम्नलिखित कार्यक्रम (निर्देशों का पालन करें) को संकलित करें, या एक पूर्व-निर्धारित प्रतिलिपि प्राप्त करें । यह केवल एक बार किए जाने की आवश्यकता है, फिर आप .exeहर जगह कॉपी कर सकते हैं (उदाहरण के लिए सिसिन्टर्नल्स सूट )।

कोड Win2k + 1 में काम करता है , दोनों के साथ और बिना UAC, डोमेन, सकर्मक समूह, जो भी - क्योंकि यह अनुमतियों की जाँच करते समय सिस्टम के समान ही उपयोग करता है। chkadmin"एडमिन" या "नॉन-एडमिन" प्रिंट करता है और एग्जिट कोड को क्रमशः 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;
}

संकलित करने के लिए, विंडोज एसडीके कमांड प्रॉम्प्ट में चलाएं:

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 या समूह सदस्यता के लिए जाँच करने के बजाय प्रक्रिया की वास्तविक क्षमताओं के लिए भी जाँच करता है, इसलिए प्रभावी अनुमति का परीक्षण किया जाता है। और यह विंडोज 2003 और XP के रूप में वापस काम करता है। सामान्य उपयोगकर्ता प्रक्रियाएँ या कोई भी उन्नत प्रक्रिया निर्देशिका जांच को विफल करती हैं, जहाँ व्यवस्थापक या उन्नत प्रक्रियाएँ सफल होती हैं।

यह परीक्षण विफल हो जाता है Everyone, अगर BUILTIN\Users, या अन्य समान समूह को सिस्टमप्रोफाइल को पढ़ने की अनुमति दी जाती है। दी, यह एक गैर-मानक कॉन्फ़िगरेशन है जो विंडोज डोमेन नियंत्रकों के रूप में कॉन्फ़िगर की गई मशीनों के अलावा है, जो 'NT AUTHORITY \ Authenticated Users' को सिस्टमप्राइफाइल के अधिकारों को पढ़ / निष्पादित करता है।


> सत्यापित करें कि VERIFY बंद है। > सत्यापन /? Cmd.exe बताता है कि क्या यह सत्यापित करना है कि आपकी फाइलें डिस्क पर सही तरीके से लिखी गई हैं। VERIFY [ON | बंद] वर्तमान VERIFY सेटिंग प्रदर्शित करने के लिए एक पैरामीटर के बिना VERIFY टाइप करें। यह कमांड स्क्रिप्ट की मदद कैसे करता है?
कनाडाई ल्यूक ने मोनिका सेप

3
@ कैनाडियन ल्यूक, कुछ अंतर्निहित कमांड कमांड एरर क्लीवल नहीं है अगर कोई त्रुटि नहीं है। इस प्रकार, लोगों को हैक जैसे उपयोगों में त्रुटि को दूर करने की आदत पड़ गई verify। मैं cd .(cd स्पेस डॉट) का उपयोग करता हूं, जो 0 पर एररएवल सेट करता है, कोई आउटपुट नहीं देता है, और शून्य डेटा फ़ाइल बनाने के लिए भी उपयोगी है cd . >somefile। उस ने कहा, मैंने विंडोज 2000, एक्सपी, विस्टा, 2003, 2008, 2012, 7, 8, और 10. पर 'डीआईआर' का परीक्षण किया था। उन सभी के लिए 'डीआईआर' सफलता के लिए 0 पर त्रुटि को स्पष्ट कर देगा यदि इसे पहले सेट किया गया था। 'निर्देशिका'। इस प्रकार मुझे यकीन नहीं है कि विलियम ने पहली स्पष्ट त्रुटि के लिए 'सत्यापन' का उपयोग क्यों किया।
user3347790
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.