Jak zdefiniować funkcję PowerShell, która wymaga podniesienia uprawnień?

20

Ponieważ nie mogę znaleźć alternatywy dla sudopolecenia elewacji systemu Linux , mam następujące pytanie:

Jak zdefiniować funkcję PowerShell, która wymaga podniesienia uprawnień? Mam na myśli monit UAC.

Powiedzmy, że taka funkcja jest następująca:

function system-check {
    SFC /ScanNow
}

System:

Windows 8.1 Pro 64-bitowy

PowerShell:

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

EDYCJA 1:

Aby być w 100% zrozumiałym, pozwól mi zmienić sformułowanie:

  1. Używam PowerShell jako użytkownik
  2. Uruchomiłem wyżej wymienioną funkcję system-check
  3. Chcę, aby funkcja podniosła się, aby móc wykonać polecenie; Uwaga: chcę, aby pojawił się monit UAC
LinuxSecurityFreak
źródło
Zauważ, że wiele wbudowanych poleceń PowerShell i poleceń dodanych przez moduły Microsoft (takie jak polecenia MSOL) często wymaga podniesienia uprawnień, ale w żaden sposób nie zapewnia pomocy w podniesieniu uprawnień. Po prostu zawodzą z tajemniczymi komunikatami o błędach. Jeśli wbudujesz w skryptach monit o podniesienie uprawnień, zapewnisz większą łatwość obsługi niż sam Microsoft.
Todd Wilcox,

Odpowiedzi:

33

Aby uruchomić określone polecenie z okna z podwyższonym poziomem uprawnień:

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

Na przykład:

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

Aby uruchomić określony skrypt z okna z podwyższonym poziomem uprawnień:

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

Aby uruchomić całą sesję PowerShell z pytaniem o UAC:

Start-Process powershell.exe -Verb runAs

Funkcja zwracająca wartość $ True lub $ False, jeśli bieżące okno działa z podwyższonymi uprawnieniami:

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

Aby skrypt działał tylko jako administrator, dodaj go na początku:

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

W PowerShell v4.0 powyższe można uprościć za pomocą instrukcji #Requires:

#Requires -RunAsAdministrator

Źródło: Uruchom z podwyższonymi uprawnieniami

Ashton
źródło