【问题标题】:workingdirectory does not work when verb is used使用动词时工作目录不起作用
【发布时间】:2019-07-31 23:07:47
【问题描述】:

使用Start-Process,当使用Verb时,Workingdirectory选项不起作用,新的powershell总是以C:\WINDOWS\system32开头。为什么是这样?如果没有额外的 cd 命令,我怎么能做到这一点?

PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14393.0
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14393.0
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


PS C:\> Start-Process -FilePath powershell.exe -Verb Runas -WorkingDirectory C:\ws\

# the new ps shell always in system32:

Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> pwd

Path
----
C:\WINDOWS\system32

【问题讨论】:

    标签: powershell windows-10


    【解决方案1】:

    至于 为什么 - 请参阅此答案的底部

    至于有效的解决方法(不过,需要使用cd (Set-Location)):

    Start-Process -FilePath powershell.exe -Verb Runas `
      -ArgumentList '-NoExit -Command "cd C:\ws"'
    

    为避免引用令人头疼的问题,您还可以单独传递参数,但命令字符串本身除外:

    Start-Process -FilePath powershell.exe -Verb Runas `
      -ArgumentList '-NoExit', '-Command', 'cd C:\ws'
    

    Venryx 指出,如果您想将此技术应用于调用通常使用-File 而不是-Command 调用的脚本文件,您必须切换到 -Command 方法(假设这两个参数不能组合),首先更改位置,然后 (;) 在新位置调用 (&) 脚本 script.ps1,此示例:

    Start-Process -FilePath powershell.exe -Verb Runas `
      -ArgumentList '-Command', 'cd C:\ws; & .\script.ps1'
    

    有关嵌套引用的更复杂示例,请参阅this answer


    在实践中 - 并且 docs do not mention that - -WorkingDirectory 参数如果您启动进程提升(具有管理权限,即-Verb RunAs - 有点晦涩 - 做了什么):位置默认为 $env:SYSTEMROOT\system32(通常是 C:\Windows\System32)。

    请注意,问题不是 -Verb 参数本身,而是其特定的 RunAs 参数。

    -WorkingDirectory-Verb RunAs 结合使用的唯一情况是,如果正在启动的程序是 PowerShellCore em>,即pwsh.exe - 无论您是从 Windows PowerShell 还是 PowerShell Core 调用

    这种行为是否有很好的技术原因,或者这是否是一个错误,我不知道。 如果您这样做,请告诉我们。

    在所有其他情况下:

    1. 按原样以当前用户身份运行(默认)

    2. 使用-Verb RunAsUser 冒充其他用户(始终带有交互式凭据提示)

    3. 使用 -Credential <PSCredential> 以其他用户身份以非交互方式运行

    -WorkingDirectory 参数受尊重的。

    但是,如果(不同的)目标用户缺乏访问隐含(当前位置)或明确指定的工作目录(通过-WorkingDirectory)的权限,则在情况(2)中,当前位置默认为C:\,并且在情况 (3) 中导致Start-Process 命令失败

    【讨论】:

    • @Venryx:P.S.:请注意,如果 pwsh.exe - PowerShell Core 的 CLI - 已启动,-WorkingDirectory 将受到尊重(并且默认情况下保留调用者的位置)。
    猜你喜欢
    • 2021-02-10
    • 2023-03-17
    • 2016-03-26
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多