Quero limpar o histórico da área de transferência do sistema operacional Windows por meio do comando VBA e PowerShell .
Eu sou um usuário do Windows 10 .
Esta é a linha de comando do PowerShell que limpa o histórico da área de transferência do sistema operacional Windows .
PS C:\Windows\system32> Restart-Service -Name "cbdhsvc*" -force
O link a seguir pode ser útil para entender do que estou falando.
Pré-requisito :
Existem duas maneiras de limpar o histórico da área de transferência usando o PowerShell
Usando o
::ClearHistory()
método estático daWindows.ApplicationModel.DataTransfer.Clipboard
classe .Isto tem a vantagem de não exigir elevação (Executar como Administrador).
No entanto, por ser uma classe UWP , ela funciona apenas no Windows PowerShell , porque o PowerShell (Core) 7+ pelo menos a partir da versão .NET 8 subjacente à versão atual, 7.4.x, não tem acesso a tais classes.
Além disso, isso funciona apenas no espaço de execução em primeiro plano (thread UI) e, portanto, não pode ser usado em trabalhos em segundo plano (incluindo trabalhos baseados em thread , por exemplo).
Usando o
Restart-Service
cmdlet para interromper e reiniciar o serviço do Windows de histórico da área de transferência:Infelizmente, esse método só funciona em uma sessão elevada do PowerShell .
No entanto, ele também funciona no PowerShell 7+ e também pode ser usado em chamadas (elevadas) que não sejam de primeiro plano , como em trabalhos.
A
Set-Clipboard $null
chamada garante que os dados atuais da área de transferência também sejam removidos (algo que a chamada da API .NET acima faz automaticamente), embora observe que no PowerShell 7+ - ao contrário do Windows PowerShell - isso não limpa a área de transferência atual, mas substitui seu conteúdo com uma string vazia , que fica registrada como tal no histórico; no entanto, devido à reinicialização do serviço e, assim, à limpeza do histórico após esta chamada, isso não importará.Se você estiver executando em um sistema mais antigo (anterior ao Windows 10 ou possivelmente uma versão muito antiga e obsoleta do Windows 10), a expressão curinga não corresponderá a um nome de serviço existente e a operação será silenciosa e autônoma .
Para descartar este caso, você pode executar o seguinte:
Um padrão curinga é necessário, porque o nome completo do serviço de histórico da área de transferência muda a cada login devido a um sufixo (pseudo) aleatório composto por
_
5 dígitos hexadecimais, por exemplocbdhsvc_5e5a8
.Invoque o comando PowerShell de limpeza do histórico da área de transferência do VBA :
Use o
.Run()
método doWScript.Shell
objeto COM...... para invocar
powershell.exe
a CLI do Windows PowerShell com a::ClearHistory()
chamada mostrada na parte superior.O código abaixo executa a janela do console do PowerShell que é invariavelmente criada hidden , usando
vbHide
o estilo de janela na.Run()
chamada.Para solução de problemas, mude para
vbNormalFocus
e coloque-NoExit
antes-Command
napowershell.exe
chamada.Se, por algum motivo, a
powershell.exe
chamada não puder ser feita a partir do thread de interface do usuário do aplicativo de hospedagem VBA, você precisará usar oRestart-Service
método e, para fazer isso, invariavelmente, será necessária a elevação .Você deve então invocar
powershell.exe
de maneira aninhada para que umapowershell.exe
chamada interna possa solicitar elevação via .Start-Process
-Verb RunAs
Importante : a menos que o aplicativo que hospeda o VBA esteja sendo executado com elevação, você receberá uma caixa de diálogo do UAC para confirmar ou autorizar a solicitação de elevação .
Como no uso direto do PowerShell, a implicação é que um usuário não administrador não poderá executar o comando, a menos que um administrador esteja presente para fornecer suas credenciais a fim de autorizar a solicitação.
Por meio de um design voltado para a segurança, você não pode automatizar a resposta às caixas de diálogo do UAC, e a única maneira de evitá- las em um processo não elevado é desabilitar completamente (partes do) UAC, o que é fortemente desencorajado por razões de segurança , ou - mas apenas se você é membro do grupo Administradores em princípio - para definir uma tarefa agendada que execute a operação desejada. Veja esta resposta para detalhes.
O código abaixo executa as janelas do console do PowerShell que são criadas ocultas , usando
vbHide
em vez devbNormalFocus
na.Run()
chamada e usando-WindowStyle Hidden
naStart-Process
chamada aninhada do PowerShell.Para solução de problemas, alterne para
vbNormalFocus
e use-NoExit
em ambaspowershell.exe
as chamadas.