我有一个PowerShell脚本,可以在客户机器上安装补丁(包含要添加的文件集)。为此,我创建了一个执行此PowerShell脚本的批处理文件 要让客户运行此批处理文件,PowerShell脚本文件也必须放在客户机器上。
PowerShell脚本采用文本格式,客户可以轻松阅读和理解。
我们可以将此脚本文件转换为某种不可读的格式(例如bin或exe),以便客户无法读取吗?
答案 0 :(得分:6)
您可以将脚本转换为Base64编码,以便它不会立即可读。要将PowerShell脚本文件转换为Base64字符串,请运行以下命令:
$Base64 = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes('c:\path\to\script file.ps1'));
要启动Base64编码的脚本,可以按如下方式调用PowerShell.exe:
powershell.exe -EncodedCommand <Base64String>
例如,以下命令:
powershell.exe -EncodedCommand VwByAGkAdABlAC0ASABvAHMAdAAgAC0ATwBiAGoAZQBjAHQAIAAiAEgAZQBsAGwAbwAsACAAdwBvAHIAbABkACEAIgA7AA==
将返回以下结果:
Hello, world!
答案 1 :(得分:3)
我尝试了@TrevorSullivan提出的解决方案,但它给了我错误
The term '????' is not recognized as the name of a cmdlet, function,
script file or operable program...
正如我后来发现编码错误一样。我找到了另一种方法,当我将这两种方法结合起来时,我得到了PS命令:
$Base64 = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes([System.IO.File]::ReadAllText("script.ps1")))
然后我可以将结果重定向到file:
$Base64 > base64Script.txt
从那里我只是复制编码的命令并将其粘贴到此处而不是<Base64String>
:
powershell.exe -EncodedCommand <Base64String>
它没有任何问题。
答案 2 :(得分:1)
感谢您的发帖。我上了@Frimlik的帖子,并创建了自己的脚本来自动化该过程。我希望这可以帮助别人。 将脚本保存到ps1文件并运行。
Function Get-FileName($initialDirectory)
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
}
Function EncodePS1ToBat {
$ScriptToEncode = Get-FileName
# Encode the script into the variable $Base64
$Base64 = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes([System.IO.File]::ReadAllText($ScriptToEncode)))
# Get the path and name to be used as output
$filePath = Split-Path $ScriptToEncode -Parent
$fileName = (Split-Path $ScriptToEncode -Leaf).Split(".")[0]
# Output the encoded script into a batch file on the same directory of the origial script
"@echo off`n powershell.exe -ExecutionPolicy Bypass -EncodedCommand $Base64" |
Out-File -FilePath "$filePath\$fileName`_Encoded.bat" -Force -Encoding ascii
}
# Call the funtion to encode the script to a batch file
EncodePS1ToBat