从批处理文件或 PowerShell 命令运行 cmdkey.exe 实用程序可能会遇到两个与特殊字符相关的问题。1. 如果从批处理文件运行,如果凭证有“(”或“)”而没有双引号,即左右括号,则不会删除该凭证。2. 如果凭证名称 aka targetname 有一个由空格包围的连字符,则 cmdkey 不会删除或创建带有该字符串“-”的凭证。
编写了一些 powershell 模块来尝试执行此操作,但我发现唯一处理此异常的模块是在 Github
https://github.com/bamcisnetworks/BAMCIS.CredentialManager
BAMCIS.CredentialManager
使用它我能够创建凭据来设置带有括号或连字符的测试环境,但更重要的是通过使用模块命令收集缓存凭据的用户列表然后将命令中的信息传递给删除命令来删除它们删除所有缓存的凭据。
一个警告。删除命令后,一段时间后,两个缓存的凭据会动态重新出现。
因此,为了解决频繁的用户锁定问题,我将尝试在注销时在用户上下文下使用 SCCM 部署它。否则,可能需要在删除凭据后重新启动系统。这是一个原型脚本,它导入模块,然后使用它来删除所有缓存的凭据,与往常一样,测试、测试、测试和使用风险自负!
Clear-host
import-Module "$PSScriptRoot\BAMCIS.CredentialManager\BAMCIS.CredentialManager.psd1"
$L = Get-CredManCredentialList -ErrorAction SilentlyContinue
If($L -eq $null)
{
Write-host "No Cached Credentials found to remove, no action taken"
$LASTEXITCODE = 0
Write-host "The last exit code is $LASTEXITCODE"
}
Else
{
ForEach($cred in $L)
{
Write-host "`tProcessing...`n"
Write-host "$($cred.TargetName.ToString())`n"
Write-host "$($cred.Type.ToString())`n`n"
$R = Remove-CredManCredential -TargetName $($cred.TargetName.ToString()) -Type $($cred.Type.ToString()) -Force
}
$L = Get-CredManCredentialList -ErrorAction SilentlyContinue -ErrorVariable $Cred_Error
If($L -eq $null)
{
Write-host "All Cached Credentials removed, program Complete"
$LASTEXITCODE = 0
Write-host "The last exit code is $LASTEXITCODE"
}
Else
{
Write-host "WARNING: One or more Cached Credentials were not removed, program Complete"
$LASTEXITCODE = 1
}
}