UAC के माध्यम से एलिवेट करना .bat फ़ाइल?


10

बहुत सीधा है कि मुझे एक जवाब खोजने में परेशानी हो रही है।

सर्वरफॉल्ट ने पहले मुझे WSUS का उपयोग किए बिना विंडोज अपडेट को स्वचालित करने का एक तरीका खोजने में मदद की । यह काल्पनिक रूप से काम कर रहा है, लेकिन इसे नेटवर्क पर चलाने के लिए, आपको पहले एक साझा ड्राइव माउंट करना होगा। यह बहुत आसान XP है क्योंकि आप सिर्फ ड्राइव को माउंट करते हैं और अपडेटर चलाते हैं।

विस्टा और डब्ल्यू 7 पर, हालांकि, यह सब सही ढंग से काम करने के लिए उन्नत विशेषाधिकार के साथ किया जाना है। यूएसी खाता नियमित उपयोगकर्ता द्वारा मुहिम शुरू की गई नेटवर्क ड्राइव को नहीं देख सकता है, इसलिए सब कुछ काम करने के लिए, मुझे net useएक बढ़े हुए शेल से शेयर को माउंट करना होगा । मैं इस शेयर को बढ़ाना और एक साधारण .bat फ़ाइल के माध्यम से अपडेटर को लॉन्च करना चाहता हूं।

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

चूंकि ये कंप्यूटर हमारे पास नहीं हैं, इसलिए मुझे Powershell स्थापित होने जैसी किसी भी चीज़ पर भरोसा नहीं किया जा सकता है, ताकि किसी भी समाधान को उन रेखाओं के साथ नियमबद्ध किया जा सके और बहुत कुछ उन चीजों पर भरोसा करना होगा जो आरटीएम विस्टा इंस्टॉल में शामिल होंगे। मुझे उम्मीद है कि मैं यहाँ स्पष्ट रूप से कुछ याद कर रहा हूँ। :)

जवाबों:


8

http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx

संपादित करें: यदि आप ग्राहक को चलाने के लिए एकल फाइल दे रहे हैं, तो WinRAR के साथ सेल्फ एक्सट्रैक्टिंग RAR क्यों न बनाएं और SFX विकल्पों में "प्रशासक की आवश्यकता" ध्वज सेट करें? यह आपको केवल 1 फ़ाइल की आपकी सीमा से अनुपस्थित करता है, आपके पास आपके लिए आवश्यक सभी संसाधन हो सकते हैं।

वैकल्पिक रूप से अपने SFX को अपने पसंदीदा SFX टूल का उपयोग करके बनाते हैं और ऊपर के एलिवेट टूल का उपयोग करते हैं।


मैं इसे ध्यान में रखूंगा, लेकिन, फिर से, मैं कुछ अतिरिक्त स्थापित करने से बचने की कोशिश कर रहा हूं क्योंकि ये मशीनें तीसरे पक्ष से संबंधित हैं।
१६:३० बजे jslaker

मेरा मानना ​​है कि आप उन्हें स्थापित किए बिना उनका उपयोग कर सकते हैं, बस उन्हें अपनी बैच फ़ाइल के साथ पैकेज कर सकते हैं।
ta.speot.is

डाउनलोड में कई फाइलें हैं, लेकिन ऐसा लगता है कि आपकी आवश्यकता के लिए सभी की आवश्यकता होगी elevate.cmdऔरelevate.vbs
अगली सूचना तक रोक दी जाएगी।

अगर मैं यह सब कुछ काफी स्टैंडअलोन / पोर्टेबल पैकेज कर सकता हूं, तो यह काम कर सकता है। जब मैं आज थोड़ा और समय लूंगा, तब इस पर बारीकी से विचार करूंगा।
jslaker

जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
मार्क हेंडरसन

4

यदि आप PowerShell में बदलने के लिए तैयार हैं, तो यह करना बहुत आसान है। यह मेरी " Elevate-Process.ps1" स्क्रिप्ट है ( suमेरी प्रोफ़ाइल में अन्य नाम के साथ ):

# Updated elevate function that does not need Elevate PowerToys
# From http://devhawk.net/2008/11/08/My+ElevateProcess+Script.aspx


$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.Verb = "runas"

# If passed multiple commands, or one (that isn't a folder) then execute that command:
if (($args.Length -gt 1) -or (($args.length -eq 1) -and -not (test-path $args[0] -pathType Container))) {

    $file, [string]$arguments = $args;
    $psi.FileName = $file  
    $psi.Arguments = $arguments
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# If from console host, handle case of one argyment that is
# a folder, to start in that folder. Otherwise start in current folder.
if ($host.Name -eq 'ConsoleHost') {
    $psi.FileName = (Get-Command -name "PowerShell").Definition
    if ($args.length -eq 0) {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (get-location).Path + "'}"
    } else {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (resolve-path $args[0]) + "'}"
    }
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# Otherwise this is some other host (which cannot be assumed to take parameters).
# So simplely launch elevated.
$psi.FileName = [system.diagnostics.process]::getcurrentprocess().path
$psi.Arguments = ""
[System.Diagnostics.Process]::Start($psi) | out-null

ऊंचा होने का पता PSH में भी लगाया जा सकता है (इस प्रकार आप ऊंचाई की जांच कर सकते हैं, और फिर जरूरत पड़ने पर ऊपर उठा सकते हैं):

$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
if ($IsAdmin) {
  $host.UI.RawUI.Foregroundcolor="Red"
  write-host "`n** Elevated Session **`n" -foreground $_errorColour -background $_errorBackound
}

मुझे लगा कि पॉवरशेल ऐसा कर सकता है, लेकिन फिर, मैं पॉवरशेल को स्थापित किए जाने पर भरोसा नहीं कर सकता, और आग के रूप में कुछ चाहिए और संभव हो सकता है।
15

@jllaker: यह निश्चित रूप से विस्टा / 2008 के साथ एक समस्या हो सकती है। लेकिन PSH Win7 / 2008R2 के साथ शामिल है ताकि इसे आसान हो जाए। एक कॉर्पोरेट स्थिति में, क्या यह रोल आउट करने के लिए ड्राइव हो सकता है?
रिचर्ड

खैर, यह एक कॉर्पोरेट स्थिति नहीं है। मेरे द्वारा लिंक किए गए मूल प्रश्न में अधिक है, लेकिन संक्षिप्त संस्करण यह है कि हम एक पीसी मरम्मत की दुकान हैं, और यह मूल रूप से सभी के आसपास काम करने की कोशिश कर रहा है कि WSUS लाइसेंस आपको WSUS का उपयोग करने से मशीनों को अपडेट तैनात करने से मना करता है जो कि नहीं हैं आपके संगठन के लिए लाइसेंस प्राप्त है। ये सभी ग्राहक मशीनें हैं जो एक्सपी आरटीएम से कुछ भी चल सकती हैं। यही कारण है कि मैं वास्तव में किसी भी स्थापित ओएस पर किसी भी आरटीएम इंस्टॉल में शामिल नहीं होने पर भरोसा नहीं कर सकता।
jslaker

यदि आप Powershell को स्थापित किए जाने पर भरोसा नहीं कर सकते हैं, तो नीचे दिए गए उत्तर की जांच करें।
मैट

3

यहाँ एक उदाहरण स्क्रिप्ट है जिसके साथ मैं आया था, मुझे आशा है कि यह दूसरों की मदद करता है। यह एक बैट फाइल है जो उपयोगकर्ता को अनुमति के लिए संकेत देती है और फिर खुद को आगे बढ़ाती है। यह कुछ वैबस्क्रिप्ट को बाहर निकालता है जो UAC प्रॉम्प्ट को ट्रिगर करता है और फिर बैट फाइल को ऊंचा चलाता है ... http://jagaroth.livejournal.com/63875.html


2

आपको यही चाहिए: http://sites.google.com/site/eneerge/home/BatchGotAdmin


1
इस स्क्रिप्ट में एक छोटा बग है, यह किसी भी पैरामीटर को आगे नहीं बढ़ाता है। बस उन्हें इस तरह से अपनी स्क्रिप्ट को कॉल करने के लिए कमांड में रखें: echo UAC.ShellExecute "% ~ s0", "% *", "", "रनस", 1 >> "% temp% \
getadmin.vbs

1

FusionInventory.org एक खुला स्रोत समाधान है जो ज्यादातर छोटी मरम्मत की दुकानों द्वारा उपयोग किया जाता है। यह आपके व्यक्तिगत दूरस्थ रूप से नियंत्रित विंडोज़ अपडेटर की तरह हो सकता है।


0

उन समाधानों में से कोई भी .cmd फ़ाइल के लिए काम नहीं करता है जिसे कमांड-लाइन मापदंडों के बारे में पता होना चाहिए। इसे .cmd फ़ाइल की शुरुआत में रखें और आपकी सभी समस्याओं का समाधान हो जाएगा। (यह इस थ्रेड को ब्राउज़ करने वाले भविष्य के लोगों के लिए है [मैंने इसे विंडोज़ एक्सपी, 7 विस्टा और 8; x86 + x64] पर परीक्षण किया है):

@echo off
NET SESSION >nul 2>&1 && goto noUAC
title.
set n=%0 %*
set n=%n:"=" ^& Chr(34) ^& "%
echo Set objShell = CreateObject("Shell.Application")>"%tmp%\cmdUAC.vbs"
echo objShell.ShellExecute "cmd.exe", "/c start " ^& Chr(34) ^& "." ^& Chr(34) ^& " /d " ^& Chr(34) ^& "%CD%" ^& Chr(34) ^& " cmd /c %n%", "", "runas", ^1>>"%tmp%\cmdUAC.vbs"
echo Not Admin, Attempting to elevate...
cscript "%tmp%\cmdUAC.vbs" //Nologo
del "%tmp%\cmdUAC.vbs"
exit /b
:noUAC

::-----Normal Batch Starts Here---------------------

0

जैसा @emilio ने कहा, वह स्क्रिप्ट ठीक है लेकिन यह किसी भी तर्क को स्वीकार नहीं करती है। यहाँ तर्क के साथ संगत होने के लिए संशोधित स्क्रिप्ट:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.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"
:--------------------------------------

0

यदि आप Powershell को स्थापित किए जाने पर भरोसा नहीं कर सकते, तो आप इस समाधान को StackOverflow पर ले सकते हैं:

बैच फ़ाइल का उपयोग करके UAC के साथ ऑटो-एलिवेट

इसे कुछ भी स्थापित करने की आवश्यकता नहीं है और बॉक्स से बाहर चलाता है। यदि आपको कमांड-लाइन तर्कों को संरक्षित करने की आवश्यकता है , तो इस अपडेट पर विचार करें।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.