将字符串添加到 Windows 剪贴板而不将其添加到 PowerShell 的历史记录中?

Adding a string to the Windows clipboard without adding it to the history in PowerShell?

我正在使用 PowerShell 将敏感信息复制到 Windows 剪贴板。

自 Windows 10 比。 1809 我们有了具有历史记录功能的增强型剪贴板。我不想让我的敏感信息出现在历史记录中。

Set-Clipboard cmdlet 没有任何有用的参数。即使在 C# 中,我似乎也没有一个简单的方法来做到这一点。

截至 2019 年 12 月,PowerShell 仍然无法天真地阻止向剪贴板历史记录添加新的剪贴板项目。

执行此操作的 API 可用于 Universal Windows Platform (UWP)。

在 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();

事实证明,您可以直接在 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
 }