我正在使用PowerShell将敏感信息复制到Windows剪贴板。
自Windows 10以来。 1809年,我们有了带有历史记录功能的增强型剪贴板。我不想在历史记录中保留我的敏感信息。
Set-Clipboard
cmdlet没有任何有用的参数。即使在C#中,我似乎也没有一种简单的方法来完成此操作。
答案 0 :(得分:1)
事实证明,您可以直接在PowerShell中访问Universal Windows Platform
(UWP)API:
Function Set-ClipboardWithoutHistory([string]$Value)
{
[int]$RequestedOperationCopy = 1
$null = [Windows.ApplicationModel.DataTransfer.DataPackage,Windows.ApplicationModel.DataTransfer,ContentType=WindowsRuntime]
$null = [Windows.ApplicationModel.DataTransfer.ClipboardContentOptions,Windows.ApplicationModel.DataTransfer,ContentType=WindowsRuntime]
$null = [Windows.ApplicationModel.DataTransfer.Clipboard,Windows.ApplicationModel.DataTransfer,ContentType=WindowsRuntime]
$dataPackage = [Windows.ApplicationModel.DataTransfer.DataPackage]::new()
$cOptions = [Windows.ApplicationModel.DataTransfer.ClipboardContentOptions]::new()
$cOptions.IsAllowedInHistory = $false
$cOptions.IsRoamable = $false
$dataPackage.RequestedOperation = $RequestedOperationCopy
$dataPackage.SetText($Value)
[Windows.ApplicationModel.DataTransfer.Clipboard]::SetContentWithOptions($dataPackage, $cOptions) | Out-Null
}
答案 1 :(得分:0)
玩了一会儿之后,我发现有一个注册表值
HKEY_CURRENT_USER \ Software \ Microsoft \ Clipboard \ EnableClipboardHistory
如果启用了历史记录,则将值设置为1,否则设置为0。将值手动更改为0,将禁用历史记录而不删除它。
将其设置回1会恢复以前的历史记录。知道这一点,我写了一个函数:
Function Set-ClipboardWithoutHistory([string]$Value)
{
$Path = "HKCU:\Software\Microsoft\Clipboard"
$Name = "EnableClipboardHistory"
[int]$currentValue = 0
If (Test-Path -Path "$Path")
{
$Key = Get-Item -LiteralPath $Path
if ($null -ne $Key.GetValue($Name, $null)) {
$currentValue = (Get-ItemProperty -Path $Path -Name $Name).EnableClipboardHistory
}
}
if ($currentValue -eq 1) {Set-ItemProperty -Path $Path -Name $Name -Value 0 | Out-Null}
Set-Clipboard -Value $Value
if ($currentValue -eq 1) {Set-ItemProperty -Path $Path -Name $Name -Value 1 | Out-Null}
}
我检查值为{1的EnableClipboardHistory
是否存在,然后才将历史设置为0来禁用历史记录,在调用Set-Clipboard
后可以将其切换回1。
如果该值不存在或为0,则无需执行任何特殊操作。
以前的剪贴板历史记录仍然存在,但是我的数据不在其中。
这可能有点麻烦,但是直到我们在以后的PowerShell版本中进行适当的切换之前,这对我来说还是不错的。
答案 2 :(得分:0)
截至2019年12月,PowerShell仍无法天真地阻止将新的剪贴板项目添加到剪贴板历史记录中。
Universal Windows Platform
(UWP)可以使用执行此操作的API。
在2019年,Microsoft使得从Windows桌面应用程序访问UWP中的某些API变得更加容易,并且事实证明,从PowerShell中访问
。所以我写了一个small .Net assembly,可以在PowerShell中使用它来防止在将文本复制到Windows剪贴板时使用历史记录功能。
诀窍是使用:
Microsoft.Windows.SDK.Contracts
访问UWP API,然后使用:
using uwp = Windows.ApplicationModel.DataTransfer;
uwp.DataPackage dataPackage = new uwp.DataPackage { RequestedOperation = uwp.DataPackageOperation.Copy };
dataPackage.SetText("text to copy");
uwp.Clipboard.SetContentWithOptions(dataPackage, new uwp.ClipboardContentOptions() { IsAllowedInHistory = false, IsRoamable = false });
uwp.Clipboard.Flush();