Das Ausführen des folgenden Befehls in einer PowerShell-Konsole mit erhöhten Rechten funktioniert und erstellt das virtuelle Laufwerk.
New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB
Führen Sie jedoch den folgenden Befehl in einer Shell ohne erhöhte Rechte aus:
runas /user:$env:userdomain\$env:username "New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB"
fordert zur Eingabe des Kennworts auf und versucht, den Befehl auszuführen:
Enter the password for dom1\user1:
Attempting to start New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB as user "dom1\user1" ...
aber dann kommt der Fehler:
RUNAS ERROR: Unable to run - New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB
2: The system cannot find the file specified.
Wie kann ich diesen Befehl von einer Shell ohne erhöhte Rechte aus zum Laufen bringen?
Antwort1
AlsPetSerAlvorgeschlagen, die Verwendung runas /user:$env:userdomain\$env:username "powershell -NoExit", "Get-VM"
wird funktionieren.
Um die Dinge auf lange Sicht weniger wortreich zu halten, habe ich jedoch Folgendes getan.
Funktion zum Ausführen eines Befehls in einer PowerShell-Sitzung mit erhöhten Rechten.
psudo.ps1
:
function psudo ([string]$cmd = "echo Hello!") {
Start-Process -FilePath "powershell" -Verb RunAs -ArgumentList "-NoExit", $cmd
}
if ($args[0] -eq $null) {
$cmd = "echo 'please provide powershell command to execute in elevated shell as a quoted string'"
} else {
$cmd = $args[0]
}
psudo $cmd
Ausführen psudo
von einer nicht erhöhten Shell:
psudo "echo 'This is a test using psudo'"
Das Ergebnis ist eine erhöhte Konsole, die geöffnet bleibt:
This is a test using psudo
Wird ausgeführt psudo
, um das PowerShell-Cmdlet auszuführen Get-VM
, das erhöhte Rechte erfordert:
psudo Get-VM
Das Ergebnis ist eine erhöhte Konsole, die geöffnet bleibt:
Name State CPUUsage(%) MemoryAssigned(M) Uptime Status Version
---- ----- ----------- ----------------- ------ ------ -------
test_vm Off 0 0 00:00:00 Operating normally 9.0
Ich wünschte nur wirklich, ich könnte dies zum Laufen bringen, Invoke-Command
sodass ich die Ergebnisse in derselben Konsole sehen könnte und nicht jedes Mal ein separates Fenster öffnen muss, wenn ich einen Befehl als Administrator ausführen möchte.
Ich konnte jedoch keine Version von etwas Ähnlichem wie dem Folgenden zum Laufen bringen:
Abrufen und Speichern von Anmeldeinformationen
Skriptdatei, getcreds.ps1
die in einem Verzeichnis in meinem Benutzerordner gespeichert ist, das sich auch in meiner $env:PATH
Variable befindet. Auf diese Weise gebe ich mein Passwort nur einmal ein und muss es jedes Mal nur einmal aus Sicherheitsgründen ändern.
getcreds.ps1
:
function getcurcreds {
$pwd = Get-Content "$HOME\ExportedPassword.txt" | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList "$env:USERDOMAIN\$env:username", $pwd
Add-Type -AssemblyName System.DirectoryServices.AccountManagement -ErrorAction Stop
$Domain = $env:USERDOMAIN
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain
$pc = New-Object System.DirectoryServices.AccountManagement.PrincipalContext $ct, $Domain
$validated = $pc.ValidateCredentials($cred.UserName, $cred.GetNetworkCredential().password)
if (-Not $validated) {
$cred = Get-Credential -UserName "$env:USERDOMAIN\$env:username" -Message "WK NA password"
Set-Content "$HOME\ExportedPassword.txt" ($cred.Password | ConvertFrom-SecureString)
}
$cred
}
getcurcreds
Funktionsänderung zum Ausführen des Befehls in einer PowerShell-Sitzung mit erhöhten Rechten und Zurückgeben der Ergebnisse an die aktuelle PowerShell-Sitzung ohne erhöhte Rechte.
psudo.ps1
:
$cred = getcreds
function psudo ([string]$cmd = "echo Hello!") {
$cmdBlk = [scriptblock]::Create(
"Start-Process -FilePath 'powershell' -Verb RunAs -ArgumentList '-NoExit', $cmd"
)
Invoke-Command -ComputerName $env:computername $cmdBlk -RunAsAdministrator -Credential $cred
}
Ich erhalte ständig Fehlermeldungen wie:
Invoke-Command : Parameter set cannot be resolved using the specified named parameters.
oder
cmdlet Invoke-Command at command pipeline position 1
Supply values for the following parameters:
ContainerId[0]: