我正在尝试创建一个Elevate函数来提升调用该函数的脚本 然而,当它的当前形式中的函数工作时,我试图通过删除调用参数并使函数通过使用范围自动确定信息来使其更加优雅。
这是目前的作品
Function Elevate ($Invocation)
{
$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=New-Object System.Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
if (-not $myWindowsPrincipal.IsInRole($adminRole))
{
$newProcess = New-Object System.Diagnostics.ProcessStartInfo "Powershell";
$newProcess.Arguments = $Invocation.MyCommand.Definition
$newProcess.Verb = "runas";
[System.Diagnostics.Process]::Start($newProcess);
exit;
}
}
如果可能,我想取消$ Invocation变量。 有没有办法从父母那里得到这个?
提前致谢
添
答案 0 :(得分:0)
Get-PSCallStack
命令可能会帮助您。倒数第二个CallStackFrame将是您的调用者。该对象有各种信息:
57> function foo { (Get-PSCallStack) | Select -Last 2 -Skip 1 }
58> foo 12
Command Arguments Location
------- --------- --------
foo {12} <No file>
如果检查返回的对象,它也有一个InvocationInfo属性。
答案 1 :(得分:0)
我弄清楚我做错了什么并修改了这个函数,它现在可以在没有明确地将$ Myinvocation传递给函数的情况下工作
我使用Script:scope从父级中获取$ MyInvocation的值。
事实证明,我第一次这样做时,我尝试使用$ Script.Myinvocation,这当然没有用。
这是工作职能。
# Elevate.ps1
Function Elevate
{
$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=New-Object System.Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
if (-not $myWindowsPrincipal.IsInRole($adminRole))
{
$newProcess = New-Object System.Diagnostics.ProcessStartInfo "Powershell";
$newProcess.Arguments = $Script:MyInvocation.MyCommand.Definition;
$newProcess.Verb = "runas";
[System.Diagnostics.Process]::Start($newProcess);
exit;
}
}
一个简短的测试脚本
# TestElevate.ps1
. .\Elevate.ps1
Elevate
# Whatever code you want executed in Elevated mode would go here
Write-Host "Elevate done"
sleep -s 2
添