首页 > 解决方案 > 为 Powershell 脚本创建一个 Potocol 处理程序

问题描述

如何为 powershell 脚本创建协议处理程序并使目标 powershell 脚本接收命令行参数?

这样做有哪些安全问题?

标签: windowspowershell

解决方案


我想我为此写了一个不错的指南,因为我在网上找到的信息缺乏一些细节。

https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767914(v=vs.85)

首先是安全问题

  1. 在您的计算机上运行的任何程序、网站、脚本等都可以触发该协议。没有授权检查。

  2. 您不应该创建通用协议处理程序。这将是一个巨大的安全问题。我的意思是,这将使程序、网站、脚本等能够在您的计算机上运行任何 powershell 脚本或命令。

在 Windows 注册表中创建协议处理程序 该协议必须在 Windows 注册表中注册。这是一个简单的任务。

我正在调用我的 powershell 协议处理程序pwsh

第 1 步:打开注册表编辑器并导航到 Computer\HKEY_CLASSES_ROOT

为了获得灵感,您可以查看Computer\HKEY_CLASSES_ROOT\http该协议处理程序是如何制作的。

第 2 步:创建以下层次结构:

创建密钥pwsh[Computer\HKEY_CLASSES_ROOT\pwsh]

(Default)编辑to的默认值URL:pwsh。请记住,我将我的协议处理程序pwsh称为 ,写下您所调用的任何内容。

添加带有名称URL Protocol和空数据的字符串值。

现在应该是这样的: pwsh 的注册表项

pwsh在, DefaultIcon:下创建一个新密钥Computer\HKEY_CLASSES_ROOT\pwsh\DefaultIcon。将(Default)数据字段设置为指向图标或图像的文件路径。我使用了 Powershell 7 的 powershell 图标C:\Program Files (x86)\PowerShell\7-preview\assets\ps_black_32x32.ico

然后创建键shell-> open->command如上图所示。

在键command中,将数据值更改(Default)为安装 powershell 的位置,然后更改要运行的 powershell 脚本。

测试时我这样做:"C:\Program Files\PowerShell\6\pwsh.exe" -noexit -executionpolicy bypass -Command {Write-Host %1} 注意我使用的是 powershell core 6,你到 powershell 的路径可能不同。run您可以通过在 Windows(Windows+R) 中 打开程序来测试它是否有效。

使用协议运行程序

预期的行为是打开带有pwsh:Hello Stackoverflow打印文本的 powershell 窗口。

Powershell 打印文本

第 3 步:创建一个 powershell 脚本来处理协议上的传入操作。键的生产就绪数据值command"C:\Program Files\PowerShell\6\pwsh.exe" -noexit -File C:\handleActions.ps1 %1

Param($Argument="") # If the protocol is ran you always at least get the protocol name as an argument. (if using the %1)
[String]
$Argument 

function Handle-Actions { # The cmdlet 'Handle-Actions' uses an unapproved verb. 
    [cmdletBinding()]
    param(
        [Parameter(Mandatory=$false, Position=0)]
        [String]
        $Argument 
    )
    $Argumuments = $Argument.Split([Char]0x003F) # Splits by `?`
    #Argumnets is now in an array, do whatever you need to next.
    $Argumuments | %{
        Write-Host $_ # Writes each argument that was seperated by ? to a line
    }
}

Handle-Actions -Argument $Argument

给定运行命令pwsh:?firstArgument?SecondArgument,脚本将输出:

pwsh:
firstArgument
SecondArgument

推荐阅读