我想使用特定用户和管理员权限启动文件
c:\dfs-build.ps1
,因为我尝试使用以下命令,但它不起作用。
当我手动打开 powershell 并运行以下命令时,它可以正常工作,并且能够使用 svc 和管理员权限运行
c:\dfs-build.ps1
文件中的命令,但是当我自动执行所有操作以在服务器启动时立即触发然后它就不起作用了。
为了在以管理员身份打开 PowerShell 时抑制是或否弹出窗口,我在注册表中禁用了
ContestPromptBehaviorAdmin
,但仍然没有成功。谁能帮我看看我做错了什么。
$cred = New-Object System.Management.Automation.PsCredential("domain\user", (ConvertTo-SecureString "pwds" -AsPlainText -Force))
$args1 = "c:\dfs-build.ps1"
Start-Process powershell.exe -Credential $cred -ArgumentList "Start-Process powershell.exe -Argumentlist '-file $args1' -verb RunAs"
您的代码原则上确实是正确的(尽管如果您的脚本文件路径包含空格,则需要额外的引用)。
只有两种基本方法可以避免(始终仅限交互)UAC确认提示:
完全禁用UAC,这是强烈建议不要这么做的。
ContestPromptBehaviorAdmin
注册表值设置为 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
至
0x0
:如果调用用户是管理员,则此自动会根据请求授予提升权限.
本身已提升的进程(以管理权限运行)启动您的进程(作为同一用户)。
Start-Process
调用,使用
-Verb RunAs
,将会 触发 UAC 确认提示。
以不同用户身份启动提升流程的一般提示: 您确实
需要nest Start-Process
调用
- 外部的一个以作为不同的用户 (
-Credential
) 启动一个进程,而内部的一个以不同的用户 的海拔启动(具有管理员权限,
-Verb RunAs
) - 因为您无法在一次单个调用中同时完成两者。 有两个陷阱
:
,则会发生错误(但是,对于管理员凭据,这种情况不太可能发生)。
的
-WorkingDirectory
参数来指定目标用户is允许访问的目录;例如,
C:\
是一个安全的选择。
进程将不会保留此工作目录并默认为
C:\Windows\System32
- 请参阅此答案了解背景信息。
@'<newline>...><newline>'@
)有一点帮助,因为它消除了转义嵌入引号字符的需要。
$cred = [pscredential]::new("domain\user", (ConvertTo-SecureString "pwds" -AsPlainText -Force))
$scriptFilePath = "c:\dfs-build.ps1"
Start-Process -Credential $cred -WindowStyle Hidden powershell.exe @"
Start-Process -Verb RunAs powershell.exe '-File \"$scriptFilePath\"'
@"
注意需要
\
转义
"
字符。在最初解析其命令行后,它们将被保留为 powershell.exe
的(隐含的)-Command
参数所看到的命令的一部分。-WindowStyle Hidden
用于隐藏短命的transitoryouter
powershell.exe
进程的窗口,防止闪烁。