powershell - PowerShell: व्यवस्थापक के रूप में कमांड चला रहा है




12 Answers

यदि वर्तमान कंसोल ऊंचा नहीं है और आप जिस ऑपरेशन को करने का प्रयास कर रहे हैं, उसे उन्नत विशेषाधिकारों की आवश्यकता है तो आप "व्यवस्थापक के रूप में चलाएं" विकल्प के साथ पावरहेल शुरू कर सकते हैं

PS> Start-Process powershell -Verb runAs

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

मैं सोच रहा हूं कि PowerShell स्क्रिप्ट के साथ ऐसा कैसे करें। मैं अपना पासवर्ड दर्ज नहीं करना चाहता; मैं सिर्फ राइट-क्लिक रन एडमिनिस्ट्रेटर विधि की नकल करना चाहता हूं।

अब तक जो कुछ भी मैंने पढ़ा है, वह आपको प्रशासक पासवर्ड की आपूर्ति करने की आवश्यकता है।




स्वयं को PowerShell स्क्रिप्ट बढ़ाना

विंडोज 8.1 / पावरशेल 4.0 +

एक पंक्ति :)

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

# Your script here



आप बैच फ़ाइल ( *.bat ) बना सकते हैं जो डबल-क्लिक होने पर व्यवस्थापकीय विशेषाधिकारों के साथ आपकी पावरहेल स्क्रिप्ट चलाता है। इस तरह, आपको अपनी पावरहेल स्क्रिप्ट में कुछ भी बदलने की आवश्यकता नहीं है । ऐसा करने के लिए, उसी नाम और अपनी पावरहेल स्क्रिप्ट के स्थान के साथ बैच फ़ाइल बनाएं और उसके बाद निम्न सामग्री डालें:

@echo off

set scriptFileName=%~n0
set scriptFolderPath=%~dp0
set powershellScriptFileName=%scriptFileName%.ps1

powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"%scriptFolderPath%\`\"; & \`\".\%powershellScriptFileName%\`\"`\"\" -Verb RunAs"

बस!

यहां स्पष्टीकरण दिया गया है:

मान लें कि आपकी पावरहेल स्क्रिप्ट पथ C:\Temp\ScriptTest.ps1 , आपकी बैच फ़ाइल में पथ C:\Temp\ScriptTest.bat होना चाहिए। जब कोई इस बैच फ़ाइल को निष्पादित करता है, तो निम्न चरणों का पालन होगा:

  1. Cmd कमांड निष्पादित करेगा

    powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"C:\Temp\`\"; & \`\".\ScriptTest.ps1\`\"`\"\" -Verb RunAs"
    
  2. एक नया पावरहेल सत्र खुल जाएगा और निम्न आदेश निष्पादित किया जाएगा:

    Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command `"cd \`"C:\Temp\`"; & \`".\ScriptTest.ps1\`"`"" -Verb RunAs
    
  3. व्यवस्थापकीय विशेषाधिकारों के साथ एक और नया पावरहेल सत्र system32 फ़ोल्डर में खुल जाएगा और निम्न तर्क इसे पास किए जाएंगे:

    -ExecutionPolicy Bypass -NoProfile -NoExit -Command "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
    
  4. निम्न आदेश प्रशासनिक विशेषाधिकारों के साथ निष्पादित किया जाएगा:

    cd "C:\Temp"; & ".\ScriptTest.ps1"
    

    एक बार स्क्रिप्ट पथ और नाम तर्क डबल उद्धृत किए जाने के बाद, उनमें स्थान या एकल उद्धरण चिह्न वर्ण ( ' ) हो सकते हैं।

  5. वर्तमान फ़ोल्डर system32 से C:\Temp ScriptTest.ps1 जाएगा और स्क्रिप्ट ScriptTest.ps1 निष्पादित किया जाएगा। एक बार पैरामीटर -NoExit पास हो जाने के बाद, विंडो बंद नहीं होगी, भले ही आपकी पावरहेल स्क्रिप्ट कुछ अपवाद फेंकता हो।




जोनाथन और शै लेवी द्वारा पोस्ट किया गया कोड मेरे लिए काम नहीं करता था।

कृपया नीचे दिए गए कार्य कोड को ढूंढें:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
#"No Administrative rights, it will display a popup window asking user for Admin rights"

$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments

break
}
#"After user clicked Yes on the popup, your file will be reopened with Admin rights"
#"Put your code here"



आपको स्क्रिप्ट को व्यवस्थापकीय विशेषाधिकारों के साथ पुन: चालू करने की आवश्यकता है और जांचें कि उस मोड में स्क्रिप्ट लॉन्च की गई थी या नहीं। नीचे मैंने एक स्क्रिप्ट लिखी है जिसमें दो कार्य हैं: DoElevatedOperations और DoStandardOperations । आपको अपना कोड रखना चाहिए जिसके लिए पहले अधिकार में मानक अधिकारों और दूसरे में मानक संचालन की आवश्यकता होती है। IsRunAsAdmin चर का उपयोग व्यवस्थापक मोड की पहचान के लिए किया जाता है।

मेरा कोड Microsoft स्क्रिप्ट से सरलीकृत निकास है जो स्वचालित रूप से जेनरेट होता है जब आप Windows Store ऐप्स के लिए ऐप पैकेज बनाते हैं।

param(
    [switch]$IsRunAsAdmin = $false
)

# Get our script path
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path

#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges.  This function waits until the
# elevated process terminates.
#
function LaunchElevated
{
    # Set up command line arguments to the elevated process
    $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '" -IsRunAsAdmin'

    # Launch the process and wait for it to finish
    try
    {
        $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
    }
    catch
    {
        $Error[0] # Dump details about the last error
        exit 1
    }

    # Wait until the elevated process terminates
    while (!($AdminProcess.HasExited))
    {
        Start-Sleep -Seconds 2
    }
}

function DoElevatedOperations
{
    Write-Host "Do elevated operations"
}

function DoStandardOperations
{
    Write-Host "Do standard operations"

    LaunchElevated
}


#
# Main script entry point
#

if ($IsRunAsAdmin)
{
    DoElevatedOperations
}
else
{
    DoStandardOperations
}



यह बर्ताव डिज़ाइन के चलते है। सुरक्षा की कई परतें हैं क्योंकि माइक्रोसॉफ्ट वास्तव में नहीं चाहता था .ps1 फाइलें नवीनतम ईमेल वायरस बनेंगी। कुछ लोगों को यह कार्य स्वचालन की बहुत धारणा का सामना करने के लिए मिलता है, जो उचित है। Vista + सुरक्षा मॉडल चीजों को "स्वचालित" करना है, इस प्रकार उपयोगकर्ता को उन्हें ठीक करना है।

हालांकि, मुझे संदेह है कि क्या आप पावरहेल को ऊंचा के रूप में लॉन्च करते हैं, फिर भी जब तक आप पावरहेल बंद नहीं करते हैं, तब तक पासवर्ड को फिर से अनुरोध किए बिना बैच फ़ाइलों को चलाने में सक्षम होना चाहिए।




यहां कई उत्तरों के करीब हैं, लेकिन जरूरत से थोड़ा अधिक काम करते हैं।

अपनी स्क्रिप्ट के लिए एक शॉर्टकट बनाएं और इसे "व्यवस्थापक के रूप में चलाएं" पर कॉन्फ़िगर करें:

  • शॉर्टकट बनाएं।
  • शॉर्टकट राइट-क्लिक करें और Properties... खोलें Properties...
  • <script-path> से powershell <script-path> से Target संपादित करें
  • उन्नत क्लिक करें ... और Run as administrator सक्षम करें



मुझे ऐसा करने का एक तरीका मिला है ...

अपनी स्क्रिप्ट खोलने के लिए बैच फ़ाइल बनाएं:

@echo off
START "" "C:\Scripts\ScriptName.ps1"

फिर अपने डेस्कटॉप पर एक शॉर्टकट बनाएं (दाएं क्लिक करें -> शॉर्टकट )।

फिर इसे स्थान में पेस्ट करें:

C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat

पहली बार खुलने पर, आपको एक बार अपना पासवर्ड दर्ज करना होगा। यह फिर इसे विंडोज क्रेडेंशियल मैनेजर में सहेज देगा।

इसके बाद आपको व्यवस्थापक उपयोगकर्ता नाम या पासवर्ड दर्ज किए बिना व्यवस्थापक के रूप में चलाने में सक्षम होना चाहिए।




शै लेवी के उत्तर के शीर्ष पर, नीचे दिए गए सेटअप का पालन करें (केवल एक बार)

  1. व्यवस्थापक अधिकारों के साथ PowerShell प्रारंभ करें।
  2. स्टैक ओवरफ़्लो प्रश्न का पालन करें पावरशेल का कहना है "इस प्रणाली पर स्क्रिप्ट का निष्पादन अक्षम है।"
  3. उदाहरण के लिए, किसी भी PATH फ़ोल्डरों में अपनी .ps1 फ़ाइल डालें। विंडोज \ System32 फ़ोल्डर

सेटअप के बाद:

  1. विन + आर दबाएं
  2. powershell Start-Process powershell -Verb runAs <ps1_file>

अब आप सब कुछ सिर्फ एक कमांड लाइन में चला सकते हैं। विंडोज 8 बेसिक 64-बिट पर उपरोक्त काम करता है।




मैंने पहले ऐसा करने का अपना तरीका नहीं देखा है, इसलिए, इसे आज़माएं। यह पालन करना आसान है और इसमें बहुत छोटा पदचिह्न है:

if([bool]([Security.Principal.WindowsIdentity]::GetCurrent()).Groups -notcontains "S-1-5-32-544") {
    Start Powershell -ArgumentList "& '$MyInvocation.MyCommand.Path'" -Verb runas
    }

बहुत सरलता से, यदि वर्तमान पावरहेल सत्र को प्रशासक विशेषाधिकारों के साथ बुलाया गया था, तो जब आप वर्तमान पहचान लेते हैं तो प्रशासक समूह प्रसिद्ध एसआईडी समूह में दिखाई देगा। यहां तक ​​कि यदि खाता उस समूह का सदस्य है, तब भी एसआईडी तब तक प्रदर्शित नहीं होगा जब तक कि उच्च प्रमाणीकरण के साथ प्रक्रिया लागू नहीं की जाती।

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




यह एक स्पष्टीकरण है ...

शक्तिशक्ति RUNAS / SAVECRED क्रेडेंशियल "सुरक्षित नहीं है", इसे आजमाया और यह व्यवस्थापक पहचान और पासवर्ड को क्रेडेंशियल कैश में जोड़ता है और अन्यत्र ओओपीएस का उपयोग किया जा सकता है! यदि आपने ऐसा किया है तो मेरा सुझाव है कि आप प्रविष्टि को चेक और हटा दें।

अपने प्रोग्राम या कोड की समीक्षा करें क्योंकि माइक्रोसॉफ्ट पॉलिसी है कि प्रोग्राम के रूप में प्रोग्राम निष्पादित करने के लिए यूएसी (एंट्री पॉइंट) के बिना एक ही कोड ब्लॉब में मिश्रित उपयोगकर्ता और एडमिन कोड नहीं हो सकता है। लिनक्स पर यह सूडो (एक ही बात) होगी।

यूएसी के पास 3 प्रकार हैं, न कि एक प्रॉम्प्ट या प्रोग्राम के मैनिफेस्ट में उत्पन्न एंट्री पॉइंट। यह प्रोग्राम को ऊपर नहीं बढ़ाता है, इसलिए यदि कोई यूएसी नहीं है और इसे व्यवस्थापक की आवश्यकता है तो यह असफल हो जाएगा। यूएसी हालांकि एक प्रशासक आवश्यकता के रूप में अच्छा है, यह प्रमाणीकरण के बिना कोड निष्पादन को रोकता है और मिश्रित कोड परिदृश्य को उपयोगकर्ता स्तर पर निष्पादित करता है।




मेरे 2 सेंट जोड़ना नेट सत्र पर आधारित मेरा सरल संस्करण जो विंडोज 7 / विंडोज 10 में अब तक हर समय काम करता है। इसे जटिल क्यों करें?

if (!(net session)) {$path =  "& '" + $myinvocation.mycommand.definition + "'" ; Start-Process powershell -Verb runAs -ArgumentList $path ; exit}

बस स्क्रिप्ट के शीर्ष पर जोड़ें और यह व्यवस्थापक के रूप में चलाएगा।




Related