Executar o comando abaixo em um console elevado do PowerShell funciona e cria a unidade virtual.
New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB
No entanto, executando o comando abaixo em um shell não elevado:
runas /user:$env:userdomain\$env:username "New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB"
solicita senha e tenta executar o comando:
Enter the password for dom1\user1:
Attempting to start New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB as user "dom1\user1" ...
mas depois dá o erro:
RUNAS ERROR: Unable to run - New-VHD -Path c:\vm_vol\Base.vhdx -SizeBytes 10GB
2: The system cannot find the file specified.
Como posso fazer com que este comando funcione em um shell não elevado?
Responder1
ComoPetSerAlsugerido, usar runas /user:$env:userdomain\$env:username "powershell -NoExit", "Get-VM"
funcionará.
No entanto, fiz o seguinte para manter as coisas menos detalhadas no longo prazo.
Função para executar comandos em uma sessão elevada do 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
Executando psudo
a partir de um shell não elevado:
psudo "echo 'This is a test using psudo'"
Resulta em console elevado que permanece aberto:
This is a test using psudo
Executando psudo
para executar o cmdlet do PowerShell Get-VM
, que precisa de elevação:
psudo Get-VM
Resulta em console elevado que permanece aberto:
Name State CPUUsage(%) MemoryAssigned(M) Uptime Status Version
---- ----- ----------- ----------------- ------ ------ -------
test_vm Off 0 0 00:00:00 Operating normally 9.0
Eu realmente gostaria de poder fazer isso funcionar Invoke-Command
para poder ver os resultados no mesmo console e não ter que abrir uma janela separada toda vez que quiser executar um comando como administrador.
No entanto, não consegui fazer com que nenhuma versão semelhante à seguinte funcionasse:
Obtenha e armazene credenciais
Arquivo de script getcreds.ps1
salvo em um diretório na minha pasta de usuário que também está na minha $env:PATH
variável. Dessa forma, eu digito minha senha apenas uma vez e apenas uma vez sempre que ela precisa ser alterada por política de segurança.
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
Modificação de função para executar o comando na sessão elevada do PowerShell e retornar resultados para a sessão atual do PowerShell não elevada.
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
}
Continuo recebendo erros como:
Invoke-Command : Parameter set cannot be resolved using the specified named parameters.
ou
cmdlet Invoke-Command at command pipeline position 1
Supply values for the following parameters:
ContainerId[0]: