【问题标题】:Start-Process -WorkingDirectory as administrator does not set locationStart-Process -WorkingDirectory 作为管理员没有设置位置
【发布时间】:2017-04-19 11:46:57
【问题描述】:

当我输入命令时

Start-Process powershell -WorkingDirectory "D:\folder"

它会打开新的 PowerShell 窗口,其中设置了 D:\folder 位置。

但是当我输入命令时

Start-Process powershell -WorkingDirectory "D:\folder" -Verb RunAs

它会打开具有管理员权限的新 PowerShell 窗口并设置了 C:\Windows\system32 位置。

如何打开具有管理员权限并确定我自己位置的新 PowerShell 窗口?

【问题讨论】:

  • 只执行cd d:\folder 作为第一个命令?
  • 出于安全原因,Windows 在提升时重置工作目录,否则当前目录中的某些内容可能会无意中以提升的权限运行。正如 4c74356b41 所说,您需要更改代码中的工作目录。 Related.
  • 谢谢,我想通过具有管理员权限的 powershell 运行脚本,该脚本从\currentdir 移动文件,但它从\system32 移动了文件,但我刚刚发现我可以通过以下方式获取当前位置$PSScriptRoot 在脚本中,现在效果很好
  • 请注意,$PSScriptRoot 会为您提供脚本的位置,该位置不一定与工作目录相同。

标签: powershell


【解决方案1】:

我也遇到了同样的问题,用这个命令解决了:

Start-Process powershell.exe -verb runAs -ArgumentList '-NoExit', '-Command', 'cd D:\folder'

运行上述命令后,Windows 将以管理员权限和指定目录启动。

【讨论】:

  • 注意:由于-file和-command不能同时使用,如果需要在新的admin powershell中启动powershell脚本,只需将; & 'PathToPS1File';追加到cd ...字符串,如在这里看到:stackoverflow.com/a/57033941/2441655
【解决方案2】:

这是另一个示例,可用于以管理员身份从 PowerShell 打开 CMD 到当前文件夹:

Start-Process cmd -ArgumentList ("/k cd {0}" -f (Get-Location).path) -Verb RunAs
如果在脚本中使用,您可以使用
Start-Process cmd -ArgumentList ("/k cd {0}" -f $PSScriptRoot) -Verb RunAs

如果您想从当前未提升的 PowerShell 会话中打开一个新的提升 PowerShell 会话,您可以使用:
Start-Process powershell.exe -ArgumentList ("-NoExit",("cd {0}" -f (Get-Location).path)) -Verb RunAs

Start-Process powershell.exe -ArgumentList ("-NoExit",("cd {0}" -f (Get-Location).path)) -Verb RunAs
在脚本中使用时

【讨论】:

    【解决方案3】:

    我刚刚运行了您的代码示例,它在WorkingDirectory 位置为我正确打开。在运行命令之前确保该目录存在。我在C 上的驱动器和辅助驱动器上进行了测试,两者都有效。

    【讨论】:

    • 对于-Verb RunAs-WorkingDirectory 仅适用于 .NET 可执行文件,因此它不适用于 cmd.exepowershell.exe(似乎有本机包装器);但是,它适用于 pwsh.exe,PowerShell(核心)CLI。
    【解决方案4】:

    以管理员身份运行 Powershell 后;

    像这样使用推送位置命令:

    Push-Location -Path C:\
    

    或将其放入您的脚本并从提升的 Powershell 提示符运行脚本。

    【讨论】:

    • 重点是启动提升的提示,并让提升的提示从启动它的提示的位置开始,而无需输入该位置。
    【解决方案5】:

    当使用Start-Process-Verb RunAs 时,-WorkingDirectory 参数兑现如果目标可执行文件是.NET em> 可执行文件;例子:

    • pwsh.exePowerShell (Core) CLI)确实尊重它。
    • cmd.exe 和奇怪的是,powershell.exeWindows PowerShell CLI),并且总是使用C:\Windows\System32

    除非您知道您正在调用一个 .NET 可执行文件,否则需要一个解决方法,以便在新进程中更改为所需的工作文件夹;为ふゆな's helpful answer提供更强大的替代方案

    $dir = $PWD.ProviderPath # use the current dir.
    
    Start-Process -Verb RunAs powershell.exe @"
    -noexit -c Set-Location -LiteralPath "$dir"
    "@
    
    • 嵌入的"..." 引用$dir 确保路径带有空格 也被正确处理。 (要使用没有中间变量的当前目录,请将"dir" 替换为"$($PWD.ProviderPath)"

      • 使用here-string (@"<newline>...<newline>"@) 不是绝对必要的,但可以简化嵌入式引用;对于常规的expandable string ("..."),嵌入的" 必须转义为`"(或"")。
    • 使用$PWD.ProviderPath 属性可确保使用文件系统-本机 路径(例如,基于在cmd.exe 中看到的驱动器号),假设调用会话的当前位置可能基于提升的进程可能尚未定义的仅 PowerShell 驱动器(请参阅New-PSDrive)(根本或不基于相同的根位置)。

      • 警告:如果本机路径在映射的网络驱动器上,这将不起作用,因为提升的进程不会看到相同的驱动器映射;在这种情况下,传递底层 UNC 路径。

    启动从给定工作目录提升的 GUI 应用程序的解决方法

    由于必须在新的提升进程中更改到工作目录,因此需要一个 helper shell 进程来执行此操作,最好通过cmd.exe 完成(以获得更好的性能):

    $exeToLaunch = 'Notepad.exe' # may include arguments
    $dir = $PWD.ProviderPath # use the current dir.
    
    Start-Process -Verb RunAs -WindowStyle Hidden cmd.exe @"
    /c cd "$dir" & $exeToLaunch
    "@
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 2023-03-28
      • 2013-05-05
      • 1970-01-01
      • 2016-11-25
      • 2021-02-06
      • 1970-01-01
      • 2012-11-16
      相关资源
      最近更新 更多