PowerShell स्क्रिप्ट में, यदि मैं व्यवस्थापक विशेषाधिकारों के साथ चल रहा हूं तो मैं कैसे जांच सकता हूं?


46

PowerShell स्क्रिप्ट में, यदि मैं व्यवस्थापक विशेषाधिकारों के साथ चल रहा हूं तो मैं कैसे जांच सकता हूं?


जवाबों:


34
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

( कमांड लाइन सेफ्टी ट्रिक्स से )


2
$ करंटप्रीनीपाल मेजबान) .UI.RawUI.Backgroundcolor = "DarkRed" स्पष्ट मेजबान लिखने-मेजबान:} "चेतावनी PowerShell एक Administrator.`n के रूप में चल रहा है"
डेवी

पहली पंक्ति: अंतिम समापन ब्रेस) गायब है। मैं इसे ठीक नहीं कर सकता क्योंकि यह 6 अक्षरों से कम का है।
जेवियर निकोलेट

57

Powershell 4.0 में आप अपनी स्क्रिप्ट के शीर्ष पर आवश्यकता का उपयोग कर सकते हैं :

#Requires -RunAsAdministrator

आउटपुट:

स्क्रिप्ट 'MyScript.ps1' को नहीं चलाया जा सकता क्योंकि इसमें व्यवस्थापक के रूप में चलने के लिए "#requires" कथन है। वर्तमान Windows PowerShell सत्र व्यवस्थापक के रूप में नहीं चल रहा है। व्यवस्थापक के रूप में चलाएँ का उपयोग करके Windows PowerShell प्रारंभ करें, और उसके बाद स्क्रिप्ट को फिर से चलाने का प्रयास करें।


बिल्कुल वैसा नहीं जैसा मैं देख रहा था लेकिन फिर भी बहुत उपयोगी था। धन्यवाद एडी!
माइकल केली

33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

उपरोक्त फ़ंक्शन निष्पादित करें। यदि कोई परिणाम सही है, तो उपयोगकर्ता के पास व्यवस्थापक विशेषाधिकार हैं।


4
यह केवल यह निर्धारित करता है कि स्क्रिप्ट चलाने वाला उपयोगकर्ता मशीन पर एक व्यवस्थापक है - और नहीं कि क्या स्क्रिप्ट को वर्तमान में प्रशासनिक विशेषाधिकारों के साथ निष्पादित किया जा रहा है । दूसरे शब्दों में, यह तब भी सही होगा, जब उपयोगकर्ता कमांड शेल लॉन्च करने के लिए "व्यवस्थापक के रूप में रन" का उपयोग नहीं करता था।
होलिस्टिक डेवलपर

2
@HolisticDeveloper, यह गलत है। यदि आप ऊँचे नहीं हैं, तो यह गलत होगा
charleswj81

@ charleswj81 अब तक मैं उस व्यवहार का निरीक्षण करता हूं जो होलिस्टिक डेवलपर का वर्णन करता है।
zneak

मुझे नहीं लगता कि आपको अर्ध उपनिवेश की आवश्यकता है ... लेकिन कहा कि मुझे नहीं लगता कि यह या तो एक त्रुटि फेंकता है
कोल्ब कैनियन

यह 2018 के लिए Win10 पर मेरे लिए काम करता है। यदि वर्तमान उपयोगकर्ता खाता ऊंचा नहीं किया गया है, तो रिटर्न गलत हो जाता है, यदि पावरहेल एलिवेटेड चल रहा है तो सही है।
अर्ग

0

यह जाँच करेगा कि क्या आप एक प्रशासक हैं, यदि नहीं तो यह एक प्रशासक के रूप में PowerShell ISE में फिर से खुल जाएगा।

उम्मीद है की यह मदद करेगा!

    $ver = $host | select version
    if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}

    # Verify that user running script is an administrator
    $IsAdmin=[Security.Principal.WindowsIdentity]::GetCurrent()
    If ((New-Object Security.Principal.WindowsPrincipal $IsAdmin).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $FALSE)
    {
      "`nERROR: You are NOT a local administrator.  Run this script after logging on with a local administrator account."
        # We are not running "as Administrator" - so relaunch as administrator

        # Create a new process object that starts PowerShell
        $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell_ise";

        # Specify the current script path and name as a parameter
        $newProcess.Arguments = $myInvocation.MyCommand.Definition;

        # Indicate that the process should be elevated
        $newProcess.Verb = "runas";

        # Start the new process
        [System.Diagnostics.Process]::Start($newProcess);

        # Exit from the current, unelevated, process
        exit
    }

0

उपरोक्त उत्तरों के संयोजन के रूप में, आप अपनी स्क्रिप्ट की शुरुआत में निम्नलिखित जैसे कुछ का उपयोग कर सकते हैं:

# todo: put this in a dedicated file for reuse and dot-source the file
function Test-Administrator  
{  
    [OutputType([bool])]
    param()
    process {
        [Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
        return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
    }
}

if(-not (Test-Administrator))
{
    # TODO: define proper exit codes for the given errors 
    Write-Error "This script must be executed as Administrator.";
    exit 1;
}

$ErrorActionPreference = "Stop";

# do something

इस लाइन के साथ अपनी स्क्रिप्ट शुरू करने के लिए एक और तरीका है, जो व्यवस्थापक अधिकारों के साथ शुरू नहीं होने पर निष्पादन को रोक देगा।

#Requires -RunAsAdministrator

1
दुर्भाग्य से, यह काम नहीं करता है। यदि स्क्रिप्ट को उन्नत अधिकारों के साथ नहीं चलाया जाता है, तो यह लोड भी नहीं होगा, और आपको अपना कस्टम त्रुटि संदेश दिखाई नहीं देगा।
जेम्सक्मुर्फी

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