ในสคริปต์ PowerShell ฉันจะตรวจสอบว่าฉันใช้งานด้วยสิทธิ์ผู้ดูแลระบบได้อย่างไร


คำตอบ:


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

(จากเทคนิคความปลอดภัยของบรรทัดคำสั่ง )


2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {ถ้า ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: ผู้ดูแลระบบ) โฮสต์) .UI.RawUI.Backgroundcolor = "DarkRed" โฮสท์โฮสต์ที่ชัดเจน "คำเตือน: PowerShell กำลังทำงานเป็นผู้ดูแลระบบ` n "}
davey

บรรทัดแรก: ไม่มีวงเล็บปีกกาสุดท้าย) หายไป ฉันไม่สามารถแก้ไขได้เนื่องจากมีการเปลี่ยนแปลงน้อยกว่า 6 ตัวอักษร
ซาเวียร์นิโคลเล็ต

57

ใน Powershell 4.0 คุณสามารถใช้ต้องการที่ด้านบนสุดของสคริปต์ของคุณ:

#Requires -RunAsAdministrator

ขาออก:

ไม่สามารถเรียกใช้สคริปต์ 'MyScript.ps1' ได้เนื่องจากมีคำสั่ง "#requires" สำหรับใช้เป็นผู้ดูแลระบบ เซสชัน Windows PowerShell ปัจจุบันไม่ได้ทำงานในฐานะผู้ดูแลระบบ เริ่ม Windows PowerShell โดยใช้ตัวเลือก Run as Administrator จากนั้นลองเรียกใช้สคริปต์อีกครั้ง


ไม่ใช่สิ่งที่ฉันกำลังมองหา แต่ก็มีประโยชน์มาก ขอบคุณเอ็ดดี้!
Michael Kelley

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

ดำเนินการฟังก์ชั่นด้านบน หากผลลัพธ์เป็น True ผู้ใช้จะมีสิทธิ์ผู้ดูแลระบบ


4
นี้จะกำหนดว่าผู้ใช้ใช้สคริปต์เป็นผู้ดูแลระบบในเครื่อง - และไม่ว่าสคริปต์กำลังมีการดำเนินการที่มีสิทธิ์ในการบริหาร กล่าวอีกนัยหนึ่งสิ่งนี้จะยังคงเป็นจริงแม้ว่าผู้ใช้จะไม่ใช้ "เรียกใช้ในฐานะผู้ดูแลระบบ" เพื่อเปิดเชลล์คำสั่ง
นักพัฒนาแบบองค์รวม

2
@HolisticDeveloper นั่นไม่ถูกต้อง หากคุณไม่ได้รับการเลื่อนระดับมันจะส่งคืนค่าเท็จ
charleswj81

@ charleswj81 ณ ตอนนี้ฉันสังเกตเห็นพฤติกรรมที่ Holistic Developer อธิบาย
zneak

ฉันไม่คิดว่าคุณต้องใช้เซมิโคลอน ... แต่นั่นบอกว่าฉันไม่คิดว่ามันจะเกิดข้อผิดพลาดอย่างใดอย่างหนึ่ง
Kolob Canyon

สิ่งนี้ใช้ได้กับฉันใน Win10 ตั้งแต่ปี 2018 ส่งคืนเท็จถ้าบัญชีผู้ใช้ปัจจุบันไม่ได้รับการยกระดับส่งคืนจริงถ้า PowerShell กำลังทำงานสูง
arberg

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
น่าเสียดายที่มันใช้ไม่ได้ หากสคริปต์ไม่ได้ทำงานด้วยสิทธิ์ในระดับสูงสคริปต์จะไม่โหลดแม้แต่และคุณจะไม่เห็นข้อความแสดงข้อผิดพลาดที่กำหนดเอง
JamesQMurphy

ขอบคุณ ฉันแก้ไขคำตอบของฉันด้านบนแล้ว
MovGP0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.