बाहरी उपकरण का उपयोग करने की आवश्यकता के बिना एक आसान तरीका है - यह विंडोज 7, 8, 8.1 और 10 के साथ ठीक चलता है और पीछे की ओर भी संगत है (विंडोज एक्सपी में कोई यूएसी नहीं है, इस प्रकार ऊंचाई की आवश्यकता नहीं है - उस में मामला स्क्रिप्ट अभी आगे बढ़ता है)।
इस कोड को देखें (मैं थ्रेड बैच फ़ाइल में पोस्ट किए गए NIronwolf द्वारा कोड से प्रेरित था - "एक्सेस डिनीड ऑन ऑन विंडोज 7? ), लेकिन मैंने इसे सुधार लिया है - मेरे संस्करण में कोई निर्देशिका नहीं बनाई गई है और हटा दी गई है। व्यवस्थापक विशेषाधिकारों के लिए जाँच करें):
::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
:: see "https://stackoverflow.com/a/12264592/1016343" for description
::::::::::::::::::::::::::::::::::::::::::::
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running Admin shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
REM Run shell as admin (example) - put here code as you like
ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
cmd /k
स्क्रिप्ट इस तथ्य का लाभ उठाती है कि NET FILE
व्यवस्थापक विशेषाधिकार की आवश्यकता होती है और errorlevel 1
यदि आपके पास नहीं है, तो रिटर्न मिलता है। ऊंचाई एक स्क्रिप्ट बनाकर हासिल की जाती है जो विशेषाधिकारों को प्राप्त करने के लिए बैच फ़ाइल को फिर से लॉन्च करती है। यह विंडोज़ को यूएसी संवाद प्रस्तुत करने का कारण बनता है और आपको व्यवस्थापक खाते और पासवर्ड के लिए पूछता है।
मैंने इसे विंडोज 7, 8, 8.1, 10 और विंडोज एक्सपी के साथ परीक्षण किया है - यह सभी के लिए ठीक काम करता है। लाभ यह है कि, स्टार्ट पॉइंट के बाद आप सिस्टम प्रशासक विशेषाधिकारों की आवश्यकता के लिए कुछ भी रख सकते हैं, उदाहरण के लिए, यदि आप डीबगिंग उद्देश्यों के लिए एक विंडोज सेवा को फिर से स्थापित करने और फिर से चलाने का इरादा रखते हैं (मान लिया कि mypackage.msi एक सर्विस इंस्टॉलर पैकेज है) :
msiexec /passive /x mypackage.msi
msiexec /passive /i mypackage.msi
net start myservice
इस विशेषाधिकार प्राप्त स्क्रिप्ट के बिना, UAC आपसे आपके व्यवस्थापक उपयोगकर्ता और पासवर्ड के लिए तीन बार पूछेगा - अब आपसे केवल एक बार शुरुआत में पूछा जाता है, और केवल यदि आवश्यक हो।
यदि आपकी स्क्रिप्ट को बस एक त्रुटि संदेश दिखाने की आवश्यकता है और अगर ऑटो-एलिवेटिंग के बजाय कोई व्यवस्थापक विशेषाधिकार नहीं हैं , तो यह और भी सरल है: आप इसे अपनी स्क्रिप्ट की शुरुआत में जोड़कर प्राप्त कर सकते हैं:
@ECHO OFF & CLS & ECHO.
NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select &
ECHO "RUN AS ADMINISTRATOR" to run this batch. Exiting... & ECHO. &
PAUSE & EXIT /D)
REM ... proceed here with admin rights ...
इस तरह, उपयोगकर्ता को राइट-क्लिक करना होगा और "व्यवस्थापक के रूप में चलाएं" चुनें । स्क्रिप्ट REM
विवरण के बाद आगे बढ़ेगी यदि वह व्यवस्थापक अधिकारों का पता लगाती है, अन्यथा एक त्रुटि के साथ बाहर निकलें। यदि आपको आवश्यकता नहीं है PAUSE
, तो इसे हटा दें।
महत्वपूर्ण: NET FILE [...] EXIT /D)
एक ही पंक्ति पर होना चाहिए। बेहतर पठनीयता के लिए इसे कई लाइनों में यहाँ प्रदर्शित किया गया है!
कुछ मशीनों पर, मैंने मुद्दों का सामना किया है, जो पहले से ही नए संस्करण में हल किए गए हैं। एक अलग दोहरी बोली से निपटने के कारण था, और दूसरा मुद्दा इस तथ्य के कारण था कि विंडोज 7 मशीन पर यूएसी अक्षम था (निम्नतम स्तर पर सेट), इसलिए स्क्रिप्ट बार-बार खुद को कॉल करती है।
मैंने इसे अब पथ में उद्धरणों को अलग करके और बाद में उन्हें फिर से जोड़कर तय किया है, और मैंने एक अतिरिक्त पैरामीटर जोड़ा है जो स्क्रिप्ट के ऊंचे अधिकारों के साथ पुन: लॉन्च होने पर जोड़ा जाता है।
निम्नलिखित द्वारा दोहरे उद्धरण हटा दिए गए हैं (विवरण यहां हैं ):
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
तब आप पथ का उपयोग करके पहुँच सकते हैं !batchPath!
। इसमें कोई दोहरा उद्धरण नहीं है, इसलिए "!batchPath!"
बाद में स्क्रिप्ट में कहना सुरक्षित है ।
रेखा
if '%1'=='ELEV' (shift & goto gotPrivileges)
जाँच करता है कि स्क्रिप्ट को पहले से ही VBScript स्क्रिप्ट द्वारा अधिकारों को ऊंचा करने के लिए बुलाया गया है , इसलिए अंतहीन पुनरावृत्ति से बचा जाए। यह प्रयोग करने वाले पैरामीटर को हटा देता है shift
।
अपडेट करें:
रजिस्टर करने के लिए होने से बचाने के .vbs
में विस्तार Windows 10 , मैं लाइन जगह ले ली है
"%temp%\OEgetPrivileges.vbs"
द्वारा
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
ऊपर स्क्रिप्ट में; cd /d %~dp0
स्टीफन (अलग उत्तर) द्वारा सुझाए गए और स्क्रिप्ट निर्देशिका को डिफ़ॉल्ट रूप में सेट करने के लिए टॉम ज़ेटो (टिप्पणी) द्वारा जोड़ा गया ।
अब स्क्रिप्ट कमांड लाइन के मापदंडों को पूरा करती है। टिप्पणियों और प्रेरणाओं के लिए jxmallet, TanisDLJ और पीटर मॉर्टेंसन को धन्यवाद।
Artjom बी के संकेत के अनुसार, मैं यह विश्लेषण किया है और जगह ले ली है SHIFT
द्वारा SHIFT /1
जिसके लिए फ़ाइल नाम को बरकरार रखता है, %0
पैरामीटर
साफ del "%temp%\OEgetPrivileges_%batchName%.vbs"
करने के लिए :gotPrivileges
अनुभाग में जोड़ा गया (जैसा कि एमएलटी ने सुझाव दिया है)। %batchName%
यदि आप समानांतर में अलग-अलग बैच चलाते हैं तो प्रभाव से बचने के लिए जोड़ा गया । ध्यान दें कि आपको for
उन्नत स्ट्रिंग फ़ंक्शंस का लाभ उठाने में सक्षम होने के लिए उपयोग करने की आवश्यकता है , जैसे कि %%~nk
, जो केवल फ़ाइल नाम को निकालता है।
अनुकूलित स्क्रिप्ट संरचना, सुधार (जोड़ा गया वैरिएबल vbsGetPrivileges
जो अब फ़ाइल के पथ या नाम को आसानी से बदलने की अनुमति देकर हर जगह संदर्भित है, केवल .vbs
फ़ाइल को हटा दें यदि बैच को ऊंचा करने की आवश्यकता है)
कुछ मामलों में, ऊंचाई के लिए एक अलग कॉलिंग सिंटैक्स आवश्यक था। यदि स्क्रिप्ट काम नहीं करती है, तो निम्न मापदंडों की जांच करें:
set cmdInvoke=0
set winSysFolder=System32
या तो 1 पैरामीटर को बदलें set cmdInvoke=1
और जांचें कि क्या पहले से ही समस्या को ठीक करता है। यह cmd.exe
ऊंचा प्रदर्शन करने वाली स्क्रिप्ट में जोड़ देगा ।
या winSysFolder=Sysnative
64 बिट सिस्टम पर 2 पैरामीटर को बदलने की कोशिश करें , यह मदद कर सकता है (लेकिन अधिकांश मामलों में इसकी आवश्यकता नहीं है)। (ADBailey ने इसकी सूचना दी है)। "Sysnative" केवल 32-बिट स्क्रिप्ट होस्ट से 64-बिट एप्लिकेशन लॉन्च करने के लिए आवश्यक है (उदाहरण के लिए एक विज़ुअल स्टूडियो बिल्ड प्रक्रिया, या अन्य 32-बिट एप्लिकेशन से स्क्रिप्ट इनवोकेशन)।
यह स्पष्ट करने के लिए कि मापदंडों की व्याख्या कैसे की जाती है, मैं इसे अब प्रदर्शित कर रहा हूं P1=value1 P2=value2 ... P9=value9
। यह विशेष रूप से उपयोगी है यदि आपको दोहरे उद्धरण चिह्नों में पथ जैसे मापदंडों को संलग्न करने की आवश्यकता है, जैसे "C:\Program Files"
।
यदि आप VBS स्क्रिप्ट को डीबग करना चाहते हैं, तो आप //X
पहले पैरामीटर के रूप में WScript.exe में पैरामीटर को जोड़ सकते हैं , जैसा कि यहां सुझाया गया है (यह CScript.exe के लिए वर्णित है, लेकिन WScript.exe के लिए भी काम करता है)।
उपयोगी कड़ियाँ: