PowerShell の実行は管理者として PowerShell を起動することとは異なります

PowerShell の実行は管理者として PowerShell を起動することとは異なります

管理者特権の PowerShell コンソールで以下のコマンドを実行すると、仮想ドライブが作成されます。

New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB

ただし、以下のコマンドを非管理者権限のシェルで実行すると、

runas /user:$env:userdomain\$env:username "New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB"

パスワードを要求し、コマンドを実行しようとします:

Enter the password for dom1\user1:  
Attempting to start New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB as user "dom1\user1" ...

しかし、次のエラーが発生します:

RUNAS ERROR: Unable to run - New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB
2: The system cannot find the file specified.

このコマンドを非昇格シェルから実行するにはどうすればよいですか?

答え1

としてペットセアル推奨されているので、使用すればrunas /user:$env:userdomain\$env:username "powershell -NoExit", "Get-VM"機能します。

ただし、長期的には冗長性を抑えるために次のことを行いました。

昇格された PowerShell セッションでコマンドを実行する関数。

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

psudo非昇格シェルから実行:

psudo "echo 'This is a test using psudo'"

開いたままの昇格されたコンソールの結果:

This is a test using psudo

昇格が必要なpsudoPowerShell コマンドレットを実行します。Get-VM

psudo Get-VM

開いたままの昇格されたコンソールの結果:

Name    State CPUUsage(%) MemoryAssigned(M) Uptime   Status             Version
----    ----- ----------- ----------------- ------   ------             -------
test_vm Off   0           0                 00:00:00 Operating normally 9.0

これを で動作させてInvoke-Command、同じコンソールで結果を確認でき、管理者としてコマンドを実行するたびに別のウィンドウを開かなくても済むようにしたいと本当に思います。

しかし、次のようなバージョンはどれも動作しませんでした。

資格情報を取得して保存する

スクリプト ファイルは、変数getcreds.ps1内にあるユーザー フォルダー内のディレクトリに保存されます$env:PATH。この方法では、パスワードを 1 回だけ入力し、セキュリティ ポリシーのために変更する必要があるたびに 1 回だけ入力することになります。

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

昇格された PowerShell セッションでコマンドを実行し、結果を現在の非昇格の PowerShell セッションに返す関数の変更。

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
}

次のようなエラーが繰り返し発生します:

Invoke-Command : Parameter set cannot be resolved using the specified named parameters.

または

cmdlet Invoke-Command at command pipeline position 1
Supply values for the following parameters:
ContainerId[0]:

関連情報