Mendeteksi jika PowerShell berjalan sebagai administrator

36

Bagaimana saya bisa tahu dalam skrip saya jika PowerShell berjalan dengan hak administrator?

Saya perlu tahu karena saya mencoba menjalankan program yang membutuhkan kemampuan untuk membuka port yang dilindungi.

Bumerang
sumber
1
Anda dapat mempertimbangkan untuk meningkatkan izin seperti yang dijelaskan dalam Memperoleh hak istimewa administrator dalam jawaban PowerShell
MiFreidgeim SO-berhenti menjadi jahat

Jawaban:

42
[bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")

Pisahkan apa yang dilakukannya:

  • [bool]- Keluarkan hasil akhirnya ke a bool.
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- Mengambil WindowsIdentityuntuk pengguna yang sedang berjalan.
  • (...).groups- Akses groupsproperti identitas untuk mengetahui kelompok pengguna yang menjadi anggota identitas itu.
  • -match "S-1-5-32-544"memeriksa untuk melihat apakah groupsmengandung SID yang Dikenal baik dari grup Administrator, identitas hanya akan memuatnya jika "dijalankan sebagai administrator" digunakan.
RMazi
sumber
2
Alih-alih hanya memposting baris kode, bisakah Anda menjelaskan apa fungsinya? Ini membantu pengunjung masa depan dalam memahami dan mengadaptasinya, jika perlu.
slhck
BOOO. Berikan orang ini suara lebih banyak
Kolob Canyon
4
Saya lebih suka jawabannya oleh @Bill_Stewart di bawah karena bebas dari string sihir.
8DH
Alih-alih menggunakan -matchdan [Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
mengetikkan
57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

Ini mengambil identitas Windows saat ini dan mengembalikan True jika identitas saat ini memiliki peran Administrator (yaitu, sedang berjalan tinggi).

Bill_Stewart
sumber
13
Meskipun jawaban yang diterima benar, jawaban ini jauh lebih jelas, terutama bagi seseorang yang dapat membaca skrip Anda enam bulan dari sekarang.
Patrick Seymour
46

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
bagaimana jika Anda ingin fungsi yang keluar jika tidak dijalankan oleh admin?
Ngarai Kolob
1
@KolobCanyon - Tidak ada hal seperti menjalankan hanya fungsi PowerShell meningkat; seluruh proses PowerShell ditinggikan atau tidak.
Bill_Stewart
@ Bill_Stewart ya, tetapi Anda bisa returnjika pengguna bukan admin :)
Kolob Canyon
1
@KolobCanyon - Anda hanya dapat meningkatkan proses PowerShell ; Anda tidak dapat meningkatkan satu fungsi . Itulah mengapa #Requires -RunAsAdministratorini berguna: Ini mencegah seluruh skrip untuk berjalan jika Anda tidak ditinggikan.
Bill_Stewart
@ Bill_Stewart Ya, saya harus menggunakannya di beberapa titik.
Ngarai Kolob