【问题标题】:Invoke mage using Powershell 2.0 and invoke operator (i.e. &)使用 Powershell 2.0 调用 mage 并调用运算符(即 &)
【发布时间】:2010-11-24 19:56:39
【问题描述】:

我想使用 Powershell 2.0 编写使用 Microsoft 的清单生成和编辑工具 (mage) 创建应用程序清单的脚本。具体来说,我希望能够将动态指定的参数值传递给 mage 命令(例如,从 xml 或其他来源读取)。

虽然我可以使用 invoke-expression 来完成此操作,但我更愿意避免将其视为安全性较低的选项(即易受“powershell 注入攻击”的影响)。

这是我所知道的。

这会成功,并显示“application.exe.manifest created”消息:

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -New Application

这不会成功,并显示消息“第一个参数必须是以下之一:-New、-Update、-Sign”(这是一个法师,而不是 powershell,错误消息):

$params = "-New Application"

& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params

如何将 $params 值传递给 mage 命令以便它被 mage 成功解释?

【问题讨论】:

  • 真正的“PowerShell 注入攻击”,加油。您正在编写什么样的 PowerShell 管理脚本,其他任何管理员都可以执行。

标签: powershell clickonce mage


【解决方案1】:

很容易将$params 定义为一个数组,每个数组项一个参数:

# define $params as an array
$params = "-New", "Application"

# and pass this array in, just as you tried before
& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params

同上$params,只需几个步骤即可动态构建:

$params = @()
...
$params += '-New'
...
$params += 'Application'
...
& "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" $params

这种方式经常被忽视,但它非常方便,它允许为本地应用程序轻松动态组合复杂的命令行。

附:而且我们不必关心参数值中的空格,我们使用参数数组中的值,不需要额外的"。

【讨论】:

    【解决方案2】:

    启动过程

    还有更多方法可以做到这一点。首先是通过Start-Process:

    $p = '-h 3 google.com'
    start-process tracert -arg $p
    

    弹出新窗口。如果您想在控制台中运行该进程,只需使用-NoNewWindow 运行即可

    $p = '-h 3 google.com'
    start-process tracert -arg $p -nonew
    
    $params = "-New Application"
    start-process "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -arg $params -nonew
    

    调用表达式

    Invoke-Expression 也可以提供帮助。但这很棘手,因为您的可执行文件的路径中有空格。这行得通,因为路径中没有空格:

    $p = '-h 3 google.com'
    invoke-expression "tracert $p"
    

    但如果有空格,则需要在里面使用&:

    $params = "-New Application"
    Invoke-Expression "& ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"" $params"
    

    注意"& ""C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe"" $params" 扩展为:

    & "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\mage.exe" -New Application
    

    这就是你想要的。但是如果其中一个参数中再次有空格,那么再次..您需要引用它:

    $file1 = 'c:\test path\file1.txt'
    $file2 = 'c:\test path\file2.txt'
    $params = """$file1"" ""$file2"""
    Invoke-Expression "& someexecutable $params"
    

    解析相当棘手:|

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2016-07-06
      • 2011-02-23
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多