Se você está preparado para converter para o PowerShell, isso é muito mais fácil de fazer. Este é o meu script " Elevate-Process.ps1
" (com su
como alias no meu perfil):
# Updated elevate function that does not need Elevate PowerToys
# From http://devhawk.net/2008/11/08/My+ElevateProcess+Script.aspx
$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.Verb = "runas"
# If passed multiple commands, or one (that isn't a folder) then execute that command:
if (($args.Length -gt 1) -or (($args.length -eq 1) -and -not (test-path $args[0] -pathType Container))) {
$file, [string]$arguments = $args;
$psi.FileName = $file
$psi.Arguments = $arguments
[System.Diagnostics.Process]::Start($psi) | out-null
return
}
# If from console host, handle case of one argyment that is
# a folder, to start in that folder. Otherwise start in current folder.
if ($host.Name -eq 'ConsoleHost') {
$psi.FileName = (Get-Command -name "PowerShell").Definition
if ($args.length -eq 0) {
$psi.Arguments = "-NoExit -Command &{set-location '" + (get-location).Path + "'}"
} else {
$psi.Arguments = "-NoExit -Command &{set-location '" + (resolve-path $args[0]) + "'}"
}
[System.Diagnostics.Process]::Start($psi) | out-null
return
}
# Otherwise this is some other host (which cannot be assumed to take parameters).
# So simplely launch elevated.
$psi.FileName = [system.diagnostics.process]::getcurrentprocess().path
$psi.Arguments = ""
[System.Diagnostics.Process]::Start($psi) | out-null
A detecção de ser elevado também pode ser feita em PSH (assim, você pode verificar a elevação e, em seguida, elevar, se necessário):
$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
if ($IsAdmin) {
$host.UI.RawUI.Foregroundcolor="Red"
write-host "'n** Elevated Session **'n" -foreground $_errorColour -background $_errorBackound
}