windows - 为 Powershell 脚本创建一个 Potocol 处理程序
问题描述
如何为 powershell 脚本创建协议处理程序并使目标 powershell 脚本接收命令行参数?
这样做有哪些安全问题?
解决方案
我想我为此写了一个不错的指南,因为我在网上找到的信息缺乏一些细节。
首先是安全问题
在您的计算机上运行的任何程序、网站、脚本等都可以触发该协议。没有授权检查。
您不应该创建通用协议处理程序。这将是一个巨大的安全问题。我的意思是,这将使程序、网站、脚本等能够在您的计算机上运行任何 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
在, 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 窗口。
第 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
推荐阅读
- python - SwiftyRSA && Python 的签名验证密码学
- java - 如何在没有内容提供者的情况下将自定义 WhatsApp 贴纸从 firebase 添加到 WhatsApp?
- ruby - Reddit API 请求中只有 OpenURI 成功
- confluence - 在蓝图开发的模板中添加当前用户和当前日期
- c# - C# 中的任务是否存在死锁?
- snowflake-cloud-data-platform - 存储过程中的 REGEXP_SUBSTR 函数返回 null
- octave - 试图在 Octave 的变量列表中找到最小值的索引
- haskell - 关于给出错误的抽象数据类型的方程式(haskell)
- ios - 验证 iOS 应用内购买的收据总是返回错误 21002
- javascript - ajax 代码包含带有 ajax 参数的“PHP site_url”