使用 -NoNewWindow 参数启动 .ps1 脚本时出现问题

使用 -NoNewWindow 参数启动 .ps1 脚本时出现问题

我有这个 powershell 脚本,其中我简单地设置了一些 DNS 服务器和接口指标:

if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{  
  $arguments = "& '" +$myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -ArgumentList $arguments
  Break
}
powershell -ExecutionPolicy Bypass -Command {
Set-DnsClientServerAddress -InterfaceIndex 4 -ResetServerAddresses
Set-NetIPInterface -InterfaceIndex 4 -AddressFamily IPv4 -InterfaceMetric 10

Set-NetIPInterface -InterfaceIndex 16 -AddressFamily IPv4 -InterfaceMetric 5

Set-DnsClientServerAddress -InterfaceIndex 22 -ResetServerAddresses
Set-NetIPInterface -InterfaceIndex 22 -AddressFamily IPv4 -InterfaceMetric 1
}

我通过右键单击 .ps1 文件并选择使用 PowerShell 运行来运行该脚本,它按预期工作。但是我想避免脚本打开新的 powershell 窗口,但我遇到了 -NoNewWindow 参数问题,因为我不知道在这个脚本中应该把它放在哪里。

如果我像下面这样执行,脚本就不会执行,我猜它会引发错误,但我看不到任何输出,它只是打开并立即关闭。

if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{  
  $arguments = "& '" +$myinvocation.mycommand.definition + "'"
  Start-Process powershell -Verb runAs -NoNewWindow -ArgumentList $arguments
  Break
}

答案1

我假设您的脚本未在管理员模式下运行,这就是它-NoNewWindow不起作用的原因。此参数表示启动的进程将在调用进程的上下文中运行并共享其控制台窗口。

问题在于参数-Verb runAs,它要求启动的进程以管理员身份运行。但是,它是在非管理员脚本的上下文中运行的,因此遵守该参数意味着将整个脚本提升为管理员。

Windows 不允许任何进程提升自身权限。进程可以以标准用户或管理员身份启动,但一旦启动,就无法更改其模式。

这两个参数有冲突,所以失败了。您需要继续按现在的方式运行脚本。

答案2

您可以将其添加到脚本的开头。您不需要管理员权限或命令行参数,因此只需单击 ps1 即可轻松运行。

$nowindow = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
add-type -name win -member $nowindow -namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)

相关内容