我目前正在为Windows卸载程序中的所有用户实施“删除设置”,并且遇到了一个我甚至无法确定是否可以解决的问题。
应用程序使用CredentialManager(keymgr.dll
)存储当前用户的凭据条目。让我们调用凭证“X”的目标。在卸载时,应删除所有用户存储的目标为“X”的凭据。卸载程序当然需要管理员权限,但我仍然觉得很难实现这一点。
对于当前用户,该命令通常通过cmdkey /delete=:X
从命令提示符解决。据我所知cmdkey.exe /list
仅帮助列出当前用户的条目,并且无法从其他用户删除本地条目。
我了解到凭据存储为C:\Users\_user_\AppData\Local\Microsoft\Credentials
文件夹下的操作系统文件,但我不知道哪些文件是我要删除的条目,删除所有文件对其他应用程序都是危险的。此外,我认为删除操作系统文件将是危险的,并可能有限制(额外的UAC提示?)。
Runas
命令是我得到的最接近的镜头,但因为它需要用户的密码,这变得非常困难,而不是我想要的卸载程序。我还需要一种方法来获取每个用户的用户名和域并迭代它们。
我更倾向于使用cmd
或powershell
。
答案 0 :(得分:10)
不想破坏旧帖子,但我需要自己这样做,所以我想我会添加它以防其他人需要它:
cmdkey /list | ForEach-Object{if($_ -like "*Target:*" -and $_ -like "*microsoft*"){cmdkey /del:($_ -replace " ","" -replace "Target:","")}}
Powershell one liner,将删除字符串中Microsoft的任何凭据。
参考: https://gist.github.com/janikvonrotz/7819990
我运行了这个并且它在本地清除它而不需要以管理员身份运行(但我是本地管理员)
答案 1 :(得分:2)
从批处理文件或PowerShell命令运行cmdkey.exe实用程序时,可能会遇到两个与特殊字符有关的问题。 1.如果从批处理文件运行,则凭据具有“(”或“)”,且不带双引号,即左括号和右括号),则不会删除该证书。 2.如果凭据名称(也称为目标名称)的连字符由空格代替,则cmdkey不会删除或创建带有字符串“-”的凭据。
编写了一些powershell模块来尝试执行此操作,但是我发现处理此异常的唯一模块是在Github上 https://github.com/bamcisnetworks/BAMCIS.CredentialManager
BAMCIS.CredentialManager
使用此方法,我能够创建凭据以设置带有括号或连字符的测试环境,但更重要的是通过使用modules命令收集缓存凭据的用户列表,然后将命令中的信息传递给remove命令删除所有缓存的凭据。
一个警告。删除命令后,一段时间后,将动态重新显示两个缓存的凭据。
因此,为了解决频繁出现的用户锁定问题,我将尝试在注销时在用户上下文下使用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
}
}
答案 2 :(得分:0)
批处理,高位cmd提示:
要找到主要的,请列出具有 MS.O,Micro和团队的任何人:
对于/ f“ tokens = 1-4 Delims =:=”('cmdkey / list ^ | findstr目标:^ | findstr / i“ MS.O Micro Teams”')中的%A执行@echo%D < / p>
这删除所有团队条目:
对于/ f“ tokens = 1-4 Delims =:=”('cmdkey / list ^ | findstr / i team')中的%A做@cmdkey / delete:%D
如果要将此内容包括为脚本,语法会略有不同。将%% A %% D变量增加一倍