Dalam skrip PowerShell, bagaimana saya bisa memeriksa apakah saya menjalankan hak administrator?

Jawaban:

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

(dari trik keamanan baris perintah )

davey
sumber
2
$ currentPrincipal = Keamanan Objek Baru.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity] :: GetCurrent ()) & {if ($ currentPrincipal.IsInRole ([Security.Principal.WindowsBuiltInRole] :: Administrator) {(dapatkan) host) .UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "Peringatan: PowerShell berjalan sebagai Administrator.`n"}
davey
Baris pertama: penjepit penutupan terakhir) tidak ada. Saya tidak dapat memperbaikinya karena kurang dari 6 karakter berubah.
Xavier Nicollet
57

Dalam Powershell 4.0 Anda dapat menggunakan membutuhkan di bagian atas script Anda:

#Requires -RunAsAdministrator

Output:

Skrip 'MyScript.ps1' tidak dapat dijalankan karena berisi pernyataan "#requires" untuk dijalankan sebagai Administrator. Sesi Windows PowerShell saat ini tidak berjalan sebagai Administrator. Mulai Windows PowerShell dengan menggunakan opsi Jalankan sebagai Administrator, lalu coba jalankan kembali skrip.

eddiegroves
sumber
Tidak persis apa yang saya cari tetapi masih sangat bermanfaat. Eddie terima kasih!
Michael Kelley
33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

Jalankan fungsi di atas. JIKA hasilnya Benar, pengguna memiliki hak admin.

Shay Levy
sumber
4
Ini hanya menentukan apakah pengguna yang menjalankan skrip adalah administrator pada mesin - dan tidak jika skrip saat ini sedang dijalankan dengan hak administratif . Dengan kata lain, ini masih akan mengembalikan true bahkan jika pengguna tidak menggunakan "jalankan sebagai administrator" untuk meluncurkan shell perintah.
Pengembang Holistik
2
@ HolisticDeveloper, itu tidak benar. Jika Anda tidak naik, itu akan kembali salah
charleswj81
@ charleswj81 sampai sekarang saya mengamati perilaku yang dijelaskan oleh Pengembang Holistik.
zneak
Saya tidak berpikir Anda memerlukan semi-kolon ... tapi itu mengatakan saya tidak berpikir itu melempar kesalahan juga
Kolob Canyon
Ini berfungsi untuk saya di Win10 pada 2018. Pengembalian Salah jika akun pengguna saat ini tidak ditinggikan, mengembalikan Benar jika powershell berjalan meningkat.
arberg
0

Ini akan memeriksa apakah Anda seorang Administrator, jika tidak maka akan dibuka kembali di PowerShell ISE sebagai Administrator.

Semoga ini membantu!

    $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
    }
blayderunner123
sumber
0

sebagai kombinasi dari jawaban di atas, Anda dapat menggunakan sesuatu seperti yang berikut di awal skrip Anda:

# 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

Metode lain adalah memulai Script Anda dengan baris ini, yang akan mencegah eksekusi ketika tidak dimulai dengan hak admin.

#Requires -RunAsAdministrator
MovGP0
sumber
1
Sayangnya, ini tidak berhasil. Jika skrip tidak dijalankan dengan hak tinggi, maka skrip tersebut tidak akan dimuat, dan Anda tidak akan melihat pesan kesalahan khusus Anda.
JamesQMurphy
Terima kasih. Saya sudah mengoreksi jawaban saya di atas.
MovGP0