PowerShell-Ausführung unterscheidet sich vom Starten von PowerShell als Administrator

PowerShell-Ausführung unterscheidet sich vom Starten von PowerShell als Administrator

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 psudovon 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-Commandsodass 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.ps1die in einem Verzeichnis in meinem Benutzerordner gespeichert ist, das sich auch in meiner $env:PATHVariable 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]:

verwandte Informationen