windows - मैं अपनी बैच फ़ाइल को स्वतः कैसे बढ़ा सकता हूं, ताकि यदि आवश्यक हो तो यह यूएसी व्यवस्थापक अधिकारों से अनुरोध करता है?




batch-file windows-10 (6)

मैं अपनी बैच फ़ाइल को केवल ऊंचा चलाने के लिए चाहता हूं। यदि ऊंचा नहीं है, तो उपयोगकर्ता को बैच को ऊंचा करने के लिए एक विकल्प प्रदान करें।

मैं सिस्टम वैरिएबल सेट करने के लिए बैच फ़ाइल लिख रहा हूं, प्रोग्राम फ़ाइलों के स्थान पर दो फाइलों की प्रतिलिपि बनाएँ, और एक ड्राइवर इंस्टॉलर शुरू करें। यदि एक विंडोज 7 / विंडोज विस्टा उपयोगकर्ता ( UAC सक्षम है और यहां तक ​​कि यदि वे एक स्थानीय व्यवस्थापक हैं) इसे राइट-क्लिक किए बिना चलाते हैं और "व्यवस्थापक के रूप में चलाएं" चुनते हैं, तो उन्हें दो फाइलों की प्रतिलिपि बनाने और सिस्टम वैरिएबल लिखने 'एक्सेस अस्वीकृत' मिल जाएगी ।

यदि उपयोगकर्ता वास्तव में एक व्यवस्थापक है तो मैं बैच को स्वचालित रूप से ऊंचा करने के लिए एक कमांड का उपयोग करना चाहता हूं। अन्यथा, अगर वे व्यवस्थापक नहीं हैं, तो मैं उन्हें बताना चाहता हूं कि बैच फ़ाइल चलाने के लिए उन्हें व्यवस्थापकीय विशेषाधिकारों की आवश्यकता है। मैं सिस्टम चर लिखने के लिए फ़ाइलों और आरईजी ADD की प्रतिलिपि बनाने के लिए xcopy का उपयोग कर रहा हूँ। मैं संभावित विंडोज एक्सपी मशीनों से निपटने के लिए उन आदेशों का उपयोग कर रहा हूं। मुझे इस विषय पर समान प्रश्न मिल गए हैं, लेकिन कुछ भी नहीं जो बैच फ़ाइल को ऊंचा करने के साथ पुनः लॉन्च करता है।


आप स्क्रिप्ट कॉल को खुद को चलाने के लिए psexec 's -h विकल्प के साथ कॉल कर सकते हैं।

मुझे यकीन नहीं है कि आप कैसे पता लगाएंगे कि यह पहले से ही ऊंचा हो रहा है या नहीं ... शायद एक्सेस किए गए त्रुटि के साथ केवल ऊंचे परम के साथ पुनः प्रयास करें?

या, आप बस xcopy लिए आदेश प्राप्त कर सकते हैं और reg.exe हमेशा psexec -h साथ चलाया जा सकता है, लेकिन अंतिम उपयोगकर्ता के लिए यह परेशान होगा यदि उन्हें हर बार अपना पासवर्ड इनपुट करने की आवश्यकता होती है (या यदि आप पासवर्ड शामिल करते हैं तो असुरक्षित लिपि में) ...


जैसा कि जेकोडर और मैट ने उल्लेख किया है, पावरशेल ने इसे आसान बना दिया है, और इसे एक नई स्क्रिप्ट बनाने के बिना बैच स्क्रिप्ट में भी एम्बेड किया जा सकता है।

मैंने मैट की लिपि को संशोधित किया:

:checkPrivileges 
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges 
) else ( powershell "saps -filepath %0 -verb runas" >nul 2>&1)
exit /b 

प्राप्त करने के लिए कोई आवश्यकता नहीं है :getPrivileges लेबल।


मैं PowerShell का उपयोग स्क्रिप्ट को फिर से लॉन्च करने के लिए करता हूं यदि यह नहीं है। इन पंक्तियों को अपनी लिपि के शीर्ष पर रखें।

net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c %~fnx0 %*'"
goto :eof
:run
:: TODO: Put code here that needs elevation

मैंने @ मैट के उत्तर से 'शुद्ध नाम' विधि की प्रतिलिपि बनाई। उनका जवाब बहुत बेहतर दस्तावेज है और इसमें त्रुटि संदेश और जैसे हैं। इसका लाभ यह है कि PowerShell पहले ही स्थापित है और विंडोज 7 और ऊपर उपलब्ध है। कोई अस्थायी VBScript (* .vbs) फ़ाइलें नहीं हैं, और आपको टूल्स डाउनलोड करने की आवश्यकता नहीं है।

इस विधि को किसी कॉन्फ़िगरेशन या सेटअप के बिना काम करना चाहिए, जब तक कि आपकी PowerShell निष्पादन अनुमतियां लॉक न हों।


मैं इसे इस तरह से करता हूं:

NET SESSION
IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE
GOTO ADMINTASKS

:ELEVATE
CD /d %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
EXIT

:ADMINTASKS
(Do whatever you need to do here)
EXIT

इस तरह यह सरल है और केवल विंडोज डिफ़ॉल्ट आदेशों का उपयोग करें। यदि आपको बैच फ़ाइल को फिर से वितरित करने की आवश्यकता है तो यह बहुत अच्छा है।

CD /d %~dp0 वर्तमान निर्देशिका को फ़ाइल की वर्तमान निर्देशिका में सेट करता है (यदि यह पहले से नहीं है, तो फ़ाइल में मौजूद ड्राइव के बावजूद, /d विकल्प के लिए धन्यवाद)।

%~nx0 एक्सटेंशन के साथ वर्तमान फ़ाइल नाम देता है (यदि आप एक्सटेंशन शामिल नहीं करते हैं और फ़ोल्डर पर एक ही नाम के साथ एक exe है, तो यह exe कॉल करेगा)।

इस पोस्ट पर इतने सारे जवाब हैं कि मुझे यह भी नहीं पता कि मेरा जवाब देखा जाएगा या नहीं।

वैसे भी, मुझे अन्य उत्तरों पर प्रस्तावित अन्य समाधानों की तुलना में यह आसान लगता है, मुझे उम्मीद है कि यह किसी की मदद करेगा।


मैंने इसे स्क्रिप्ट की शुरुआत में चिपकाया:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs" %*
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

मैट का एक बड़ा जवाब है, लेकिन यह स्क्रिप्ट को पारित किसी भी तर्क को दूर करता है। यहां मेरा संशोधन है जो तर्क रखता है। मैंने विंडोज 8 में काम करने वाली निर्देशिका समस्या के लिए स्टीफन का फिक्स भी शामिल किया।

@ECHO OFF
setlocal EnableDelayedExpansion

NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto START ) else ( goto getPrivileges ) 

:getPrivileges
if '%1'=='ELEV' ( goto START )

set "batchPath=%~f0"
set "batchArgs=ELEV"

::Add quotes to the batch path, if needed
set "script=%0"
set script=%script:"=%
IF '%0'=='!script!' ( GOTO PathQuotesDone )
    set "batchPath=""%batchPath%"""
:PathQuotesDone

::Add quotes to the arguments, if needed.
:ArgLoop
IF '%1'=='' ( GOTO EndArgLoop ) else ( GOTO AddArg )
    :AddArg
    set "arg=%1"
    set arg=%arg:"=%
    IF '%1'=='!arg!' ( GOTO NoQuotes )
        set "batchArgs=%batchArgs% "%1""
        GOTO QuotesDone
        :NoQuotes
        set "batchArgs=%batchArgs% %1"
    :QuotesDone
    shift
    GOTO ArgLoop
:EndArgLoop

::Create and run the vb script to elevate the batch file
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
ECHO UAC.ShellExecute "cmd", "/c ""!batchPath! !batchArgs!""", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%temp%\OEgetPrivileges.vbs" 
exit /B

:START
::Remove the elevation tag and set the correct working directory
IF '%1'=='ELEV' ( shift /1 )
cd /d %~dp0

::Do your adminy thing here...






elevated-privileges