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

时间:2019-03-13 20:13:49

标签: windows powershell clipboard

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

自Windows 10以来。 1809年,我们有了带有历史记录功能的增强型剪贴板。我不想在历史记录中保留我的敏感信息。

Set-Clipboard cmdlet没有任何有用的参数。即使在C#中,我似乎也没有一种简单的方法来完成此操作。

3 个答案:

答案 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();