यह पता कैसे करें कि CMD प्रशासक के रूप में चल रहा है / विशेषाधिकार बढ़ा दिया है?


101

एक बैच फ़ाइल के अंदर से, मैं परीक्षण करना चाहूंगा कि क्या मैं प्रशासक / उन्नत विशेषाधिकार के साथ चल रहा हूं।

"व्यवस्थापक के रूप में चलाएं" चयनित होने पर उपयोगकर्ता नाम नहीं बदलता है, ताकि काम न हो।

यदि एक सार्वभौमिक रूप से उपलब्ध कमांड थे, जिसका कोई प्रभाव नहीं है, लेकिन प्रशासनिक विशेषाधिकारों की आवश्यकता है, तो मैं इसे चला सकता हूं और विशेषाधिकारों के परीक्षण के लिए त्रुटि कोड की जांच कर सकता हूं। अब तक, मुझे ऐसी कोई कमान नहीं मिली है। मैंने जो आदेश पाया है, वह एक एकल, गैर-विशिष्ट त्रुटि कोड को लौटाता है, जो कुछ भी संकेत दे सकता है, और वे कई कारणों से असफलता का सामना कर रहे हैं।

मैं केवल विंडोज 7 के बारे में परवाह करता हूं, हालांकि पहले के ऑपरेटिंग सिस्टम का समर्थन अच्छा होगा।


एक हैक के लिए कोशिश करनी होगी और echo > somefileएक निर्देशिका में करना होगा जिसे व्यवस्थापक निजी की आवश्यकता होगी। यह एक साइडफ़ेक्ट के रूप में एक फ़ाइल का उत्पादन करेगा, लेकिन आप टकराव की जांच कर सकते हैं और एक वर्कअराउंड के रूप में एक अद्वितीय फ़ाइल नाम बना सकते हैं।
मार्क बी


1
[आप यहां एक आत्म-उत्थान बैच पा सकते हैं] [1] [१]: stackoverflow.com/questions/4051883/…
अमृत ​​अली


1
@npocmaka आपके द्वारा जुड़ा प्रश्न वास्तव में इस एक का डुप्लिकेट है?) (2013 बनाम 2011)
Matthieu

जवाबों:


62

ADDENDUM : विंडोज 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
एटी कमांड सही है! आपका Google-फू मेरे Google-फू से बेहतर है। ;-)
जेफ़

2
+1 @Rushyo, मैंने आपके समाधान को थोड़ा बढ़ाया और इसे यहाँ पोस्ट किया क्योंकि यह वही है जो मैं मूल रूप से भर आया था। धन्यवाद! stackoverflow.com/questions/4051883/…
blak3r

16
ATविंडोज 8 पर काम नहीं करता है, लेकिन मुझे एक बेहतर समाधान मिल गया है। मैंने इसे एक अन्य प्रश्न के उत्तर के रूप में यहां पोस्ट किया है: stackoverflow.com/questions/4051883/…
मिथोफैक्लोन

4
मैं सलाह देता हूं कि whoami / समूहों | findstr / b BUILTIN \ Admin | findstr / c: "सक्षम समूह" && गूंज "मेरे पास एक व्यवस्थापक है!" - 95, 98, 2000, xp, विस्टा, 7, 8 पर काम! (टिप्पणी से "मुझे एटी का उपयोग करने के रशियो के आत्मज्ञान पसंद है ...")
barwnikk

1
मैं pingलापता की जगह लेना पसंद करता हूं sleep:)
Matthieu

96

इस ट्रिक में केवल एक कमांड की आवश्यकता है: net sessionकमांड प्रॉम्प्ट में टाइप करें ।

यदि आप एक व्यवस्थापक नहीं हैं , तो आपको एक पहुँच प्राप्त संदेश से वंचित है।

System error 5 has occurred.

Access is denied.

यदि आप एक व्यवस्थापक हैं , तो आपको एक अलग संदेश मिलता है, सबसे सामान्य:

There are no entries in the list.

से एमएस टेकनेट :

मापदंडों के बिना उपयोग किया जाता है, नेट सत्र स्थानीय कंप्यूटर के साथ सभी सत्रों के बारे में जानकारी प्रदर्शित करता है।


यह कार्यात्मक रूप से रशियो के उत्तर के समान है, जो एटी कमांड का उपयोग करता था।
जेफ

12
विंडोज 8.1 पर, यह एटी के लिए पसंद किया जाता है, क्योंकि एटी को हटा दिया गया है। रुशियो के उत्तर का उपयोग करना लेकिन शुद्ध सत्र या net.exe सत्र के साथ एटी को प्रतिस्थापित करना मेरे लिए पूरी तरह से काम करता है।
kayleeFrye_onDeck

यह कमांड प्रॉम्प्ट पर ऐसा करने का सबसे आसान तरीका लगता है (जो बैच फ़ाइल से अलग है, हालांकि)।
एंडरलैंड

2
There are no entries in the list.विंडोज 10 प्रो में बस प्रिंट करता है
बजे

1
एक बैच फ़ाइल में कुछ इस तरह का उपयोग करें:net session >nul 2>&1 || (echo not admin&goto :eof)
ailech

27

मुझे रुसियो का एटी का उपयोग करने का सुझाव पसंद है, लेकिन यह एक और विकल्प है:

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

यदि आप चाहते हैं तो यह दृष्टिकोण आपको गैर-व्यवस्थापक और गैर-उन्नत व्यवस्थापक के बीच अंतर करने की भी अनुमति देगा। गैर-उन्नत व्यवस्थापकों के पास अभी भी समूह सूची में BUILTIN \ प्रशासक हैं, लेकिन यह सक्षम नहीं है।

हालांकि, यह कुछ गैर-अंग्रेजी भाषा प्रणालियों पर काम नहीं करेगा। इसके बजाय, प्रयास करें

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

(यह विंडोज 7 पर काम करना चाहिए लेकिन मुझे पहले के संस्करणों के बारे में निश्चित नहीं है।)


1
पॉलिश संस्करण में, मेरे पास: BUILTIN \ Administratorzy है, इसलिए, मेरा सुझाव है: whoami / group | findstr / b BUILTIN \ Admin | findstr / c: "सक्षम समूह" और& गोटो: आइडेडिटेटर
बार्वनिक

@barwnikk, मैं whoami/groupsमैन्युअल रूप से लाइनों को स्कैन करने की सलाह देता हूं । बहुत लंबा समय नहीं लगेगा और आदेश आपके मस्तिष्क में फिट बैठता है।
पचेरियर

@ स्पेसर: प्रश्न का बिंदु एक बैच फ़ाइल में उन्नयन का पता लगाना है । यदि कोई व्यक्ति कमांड लाइन पर है, तो उन्हें बस इतना करना चाहिए कि वह खिड़की के शीर्षक को देखें, जो हमेशा ऊंचा होने पर "प्रशासक:" शुरू होता है।
हैरी जॉनसन

@ हैरी जॉनसन, वाह यह एहसास नहीं था। क्या "व्यवस्थापक" शीर्षक विंडोज़ के सभी संस्करणों के लिए दिखाई देता है?
17

@ स्पेसर: सभी वर्तमान संस्करण (विस्टा आगे)।
जॉन में हैरी जॉनसन

24

बहुत ज्यादा दूसरों ने पहले क्या रखा है, लेकिन एक लाइनर के रूप में जिसे एक बैच कमांड की शुरुआत में रखा जा सकता है। (ठीक है, आमतौर पर @echo बंद के बाद।)

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

2
यह अद्यतित संस्करण है और यह net.exe से अप्रासंगिक आउटपुट को छुपाता है
andersand

2
विंडोज 10 पर अच्छी तरह से काम करता है
जेम्स पैक

महान काम किया, बस एंड टाइमआउट / टी 10 और एग्जिट / बी 1 के अंत को ट्वीक किया ताकि एक बैच फ़ाइल में विंडो तुरंत गायब न हो।
WhoIsRich

12

विस्टा, विन 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

निम्न आलेख अखंडता के स्तर को सूचीबद्ध करता है SID विंडोज़ उपयोग करता है: http://msdn.microsoft.com/en-us/library/bb625963.aspx


whoami / समूहों में एक किनारा मामला है जहां आपको गलत जानकारी मिलती है। देखें 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
)

यह निश्चित रूप से मेरे लिए काम किया और सिद्धांत ध्वनि प्रतीत होता है; से MSFT के क्रिस जैक्सन :

जब आप ऊंचे स्तर पर चल रहे होते हैं, तो आपके टोकन में एक ACE होता है जिसे अनिवार्य लेबल \ High अनिवार्य स्तर कहा जाता है।


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

7

समाधान:

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

विंडोज 10 के तहत काम नहीं करता है

विंडोज के सभी संस्करणों के लिए ऐसा किया जा सकता है:

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

6

मैंने प्रतिक्रियाओं के कई (सबसे अधिक) पढ़े, फिर एक बैट फाइल विकसित की जो मेरे लिए विन 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 / समूहों में एक किनारा मामला है जहां आपको गलत जानकारी मिलती है। देखें stackoverflow.com/questions/4051883/…
zumalifeguard

इसके लिए शुक्रिया! दूसरे "whoami" समाधान ने विंडोज 8.1 पर मेरे लिए काम नहीं किया। यह एक किया।
रयान


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%)

यह उपयोगकर्ता की स्थिति के आधार पर या तो हां या नहीं देता है ...

यह चर "एडमिन" के मूल्य को समान रूप से हां या नहीं के बराबर सेट करता है।


यह तभी काम करेगा जब उपयोगकर्ता प्रशासक स्थानीय समूह का प्रत्यक्ष सदस्य होगा। यदि उपयोगकर्ता एक डोमेन समूह का सदस्य है (उदाहरण के लिए, "डोमेन व्यवस्थापक") जो व्यवस्थापक समूह का सदस्य है, तो यह काम नहीं करेगा।
हैरी जॉनसन

1

यदि आप व्यवस्थापक अधिकारों के साथ एक उपयोगकर्ता के रूप में चल रहे हैं, तो परिवेश चर SessionName परिभाषित नहीं किया जाएगा और बैच फ़ाइल चलाते समय आपके पास अभी भी व्यवस्थापक अधिकार नहीं हैं।

आपको "नेट सत्र" कमांड का उपयोग करना चाहिए और व्यवस्थापक अधिकारों को सत्यापित करने के लिए "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

यहां मैंने विंडोज 7 के माध्यम से विंडोज 7 पर एक सरल विधि का उपयोग किया है। मूल रूप से, मैं विंडोज "System32 \ WDI \ LogFiles" फ़ोल्डर की जांच करने के लिए "IF EXIST" कमांड का उपयोग करता हूं। WDI फ़ोल्डर कम से कम 7 से विंडोज के प्रत्येक इंस्टॉल पर मौजूद है, और इसे एक्सेस करने के लिए व्यवस्थापक विशेषाधिकारों की आवश्यकता है। WDI फ़ोल्डर में हमेशा एक LogFiles फ़ोल्डर होता है। इसलिए, WDI \ LogFiles फ़ोल्डर पर "IF EXIST" चल रहा है, यदि व्यवस्थापक के रूप में चलाया जाता है, और असत्य के रूप में नहीं चलने पर गलत वापस आ जाएगा। यह एक बैच फ़ाइल में विशेषाधिकार के स्तर की जाँच करने के लिए इस्तेमाल किया जा सकता है, और जो भी आप उस परिणाम के आधार पर इच्छा के लिए शाखा।

यहाँ उदाहरण कोड का एक संक्षिप्त स्निपेट दिया गया है:

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. Windows Explorer में WDI फ़ोल्डर को खोलने का प्रयास और फिर "जारी रखें" पर क्लिक करने पर संकेत मिलने पर उस उपयोगकर्ता खाते के लिए स्थायी पहुँच अधिकार जुड़ जाएंगे, इस प्रकार मेरा तरीका टूट जाएगा। यदि ऐसा होता है, तो इसे WDI फ़ोल्डर सुरक्षा अनुमतियों से उपयोगकर्ता खाते को हटाकर ठीक किया जा सकता है। यदि किसी कारण से उपयोगकर्ता विंडोज एक्सप्लोरर के साथ डब्ल्यूडीआई फ़ोल्डर का उपयोग करने में सक्षम हो जाता है, तो आपको एक अलग फ़ोल्डर की जांच करने के लिए कोड को संशोधित करना होगा (जैसा कि ऊपर उल्लेख किया गया है, इस उद्देश्य के लिए विशेष रूप से अपना स्वयं का निर्माण एक अच्छा विकल्प हो सकता है) ।

इसलिए, माना जाता है कि मेरा तरीका सही नहीं है क्योंकि इसे तोड़ा जा सकता है, लेकिन यह एक अपेक्षाकृत त्वरित विधि है जिसे लागू करना आसान है, विंडोज 7, 8 और 10 के सभी संस्करणों के साथ समान रूप से संगत है, और बशर्ते मैं उल्लेख किए गए गुहाओं के प्रति सावधान रहूं। मेरे लिए 100% प्रभावी रहा।


0

Win7 एंटरप्राइज और Win10 एंटरप्राइज के लिए काम करता है

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.