Trong tập lệnh PowerShell, làm cách nào tôi có thể kiểm tra xem tôi có đang chạy với quyền quản trị viên không?


Câu trả lời:


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

(từ thủ thuật an toàn dòng lệnh )


2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCản ()) & {if ($ currentPrincipal.IsInRole ([Security.Princalal host) .UI.RawUI.Backgroundcolor = "DarkRed" rõ ràng-host-host ghi "Cảnh báo: PowerShell có chạy dưới dạng Administrator.`n"}
Davey

Dòng đầu tiên: cú đúp đóng cuối cùng) bị thiếu. Tôi không thể sửa nó vì nó ít hơn 6 ký tự.
Xavier Nicollet

57

Trong Powershell 4.0, bạn có thể sử dụng yêu cầu ở đầu tập lệnh của mình:

#Requires -RunAsAdministrator

Đầu ra:

Tập lệnh 'MyScript.ps1' không thể chạy được vì nó chứa câu lệnh "#requires" để chạy với tư cách Quản trị viên. Phiên Windows PowerShell hiện tại không chạy với tư cách Quản trị viên. Khởi động Windows PowerShell bằng cách sử dụng tùy chọn Run as Administrator, sau đó thử chạy lại tập lệnh.


Không chính xác những gì tôi đang tìm kiếm nhưng vẫn rất hữu ích. Cảm ơn Eddie!
Michael Kelley

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

Thực hiện chức năng trên. NẾU kết quả là True, người dùng có quyền quản trị viên.


4
Điều này chỉ xác định xem người dùng đang chạy tập lệnh có phải là quản trị viên trên máy hay không - nếu tập lệnh hiện đang được thực thi với các đặc quyền quản trị . Nói cách khác, điều này vẫn sẽ trả về đúng ngay cả khi người dùng không sử dụng "chạy với tư cách quản trị viên" để khởi chạy shell lệnh.
Nhà phát triển toàn diện

2
@HolisticDeveloper, điều đó không chính xác. Nếu bạn không nâng cao, nó sẽ trả về false
charleswj81

@ charleswj81 tính đến thời điểm hiện tại tôi quan sát hành vi mà Holistic Developer mô tả.
zneak

Tôi không nghĩ bạn cần dấu hai chấm ... nhưng điều đó nói rằng tôi cũng không nghĩ rằng nó cũng gây ra lỗi
Kolob Canyon

Điều này hoạt động với tôi trên Win10 kể từ năm 2018. Trả về Sai nếu tài khoản người dùng hiện tại không được nâng cao, trả về Đúng nếu powershell đang chạy cao.
arberg

0

Điều này sẽ kiểm tra xem bạn có phải là Quản trị viên hay không, nếu không thì nó sẽ mở lại trong PowerShell ISE với tư cách Quản trị viên.

Hi vọng điêu nay co ich!

    $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

như một sự kết hợp của các câu trả lời ở trên, bạn có thể sử dụng một cái gì đó như sau khi bắt đầu tập lệnh của mình:

# 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

Một phương pháp khác là khởi động Script của bạn với dòng này, điều này sẽ ngăn nó thực thi khi không được bắt đầu với quyền quản trị.

#Requires -RunAsAdministrator

1
Thật không may, điều này không hoạt động. Nếu tập lệnh không được chạy với quyền nâng cao, thì nó thậm chí sẽ không tải và bạn sẽ không thấy thông báo lỗi tùy chỉnh của mình.
JamesQMurphy

Cảm ơn. Tôi đã sửa câu trả lời của tôi ở trên.
MovGP0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.