Bagaimana cara mendefinisikan fungsi PowerShell yang membutuhkan ketinggian?

20

Karena saya tidak dapat menemukan alternatif untuk sudoperintah elevasi Linux , saya memiliki pertanyaan berikut:

Bagaimana cara mendefinisikan fungsi PowerShell yang membutuhkan ketinggian? Maksud saya UAC prompt.

Katakanlah, fungsi seperti berikut:

function system-check {
    SFC /ScanNow
}

Sistem:

Windows 8.1 Pro 64-bit

PowerShell:

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  117

EDIT1:

Agar 100% dapat dimengerti, izinkan saya ulangi:

  1. Saya menjalankan PowerShell sebagai pengguna
  2. Saya menjalankan fungsi yang disebutkan di atas system-check
  3. Saya ingin fungsi untuk meningkatkan agar dapat menjalankan perintah; perhatikan, bahwa saya ingin UAC prompt muncul
LinuxSecurityFreak
sumber
Perhatikan bahwa banyak perintah built-in PowerShell dan perintah yang ditambahkan oleh modul Microsoft (seperti perintah MSOL) sering membutuhkan peningkatan tetapi sama sekali tidak memberikan bantuan dalam peningkatan hak istimewa. Mereka hanya gagal dengan pesan kesalahan samar. Jika Anda membuat prompt elevasi ke dalam skrip Anda, Anda akan memberikan lebih banyak keramahan pengguna daripada Microsoft sendiri.
Todd Wilcox

Jawaban:

33

Untuk menjalankan perintah tertentu dari jendela yang ditinggikan:

Start-Process -FilePath powershell.exe -ArgumentList {$ScriptBlock} -verb RunAs

Sebagai contoh:

Start-Process -FilePath powershell.exe -ArgumentList {
    SFC /scannow
} -verb RunAs

Untuk menjalankan skrip tertentu dari jendela yang ditinggikan:

Start-Process powershell -ArgumentList '-noprofile -file MyScript.ps1' -verb RunAs

Untuk menjalankan seluruh sesi PowerShell yang meminta UAC:

Start-Process powershell.exe -Verb runAs

Fungsi untuk mengembalikan $ True atau $ False jika jendela saat ini berjalan dengan izin yang lebih tinggi:

function isadmin
 {
 #Returns true/false
   ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
 }

Untuk memastikan skrip hanya dijalankan Sebagai Admin, tambahkan ini ke awal:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
 {
  Echo "This script needs to be run As Admin"
  Break
 }

Di PowerShell v4.0 di atas dapat disederhanakan dengan menggunakan pernyataan #Requires:

#Requires -RunAsAdministrator

Sumber: Jalankan dengan izin yang lebih tinggi

Ashton
sumber