我们如何使用另一个用户和管理员权限触发PowerShell文件

问题描述 投票:0回答:1

我想使用特定用户和管理员权限启动文件

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"
powershell uac elevated-privileges start-process
1个回答
0
投票
  • 您的代码原则上确实是正确的(尽管如果您的脚本文件路径包含空格,则需要额外的引用)。

  • 只有两种基本方法可以避免(始终仅限交互)UAC确认提示

    • 完全禁用UAC,这是强烈建议不要这么做的

        相对不那么不安全 - 但
      • 仍然不明智 - 替代方法是将 ContestPromptBehaviorAdmin
         注册表值设置为 
        HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
        0x0
        :如果调用用户是管理员,则此
        自动会根据请求授予提升权限.
    • 本身已提升的进程(以管理权限运行)启动您的进程(作为同一用户)。

如果没有其中任何一个,您内心的

Start-Process

 调用,使用 
-Verb RunAs
将会 触发 UAC 确认提示。


以不同用户身份启动提升流程的一般提示 您确实

需要

nest Start-Process 调用

 - 外部的一个以 
作为不同的用户 (-Credential) 启动一个进程,而内部的一个以不同的用户
 的海拔
启动(具有管理员权限,-Verb RunAs) - 因为您无法在一次
单个
调用中同时完成两者 有两个

陷阱

    如果凭据所标识的目标用户不允许访问调用者的
  • 工作目录

    ,则会发生错误(但是,对于管理员凭据,这种情况不太可能发生)。

      解决方法是使用
    • Start-Process

      -WorkingDirectory参数来指定目标用户
      is
      允许访问的目录;例如,C:\ 是一个安全的选择。
      
      

    • 但是,
    • elevated

      powershell.exe

      进程将
      不会保留此工作目录并默认为C:\Windows\System32 - 请参阅
      此答案
      了解背景信息。

  • 此类嵌套调用的引用会变得很棘手;
  • here-string

    @"<newline>...><newline>"@

    @'<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
进程的窗口,防止闪烁。
    

© www.soinside.com 2019 - 2024. All rights reserved.