从Windows的所有用户的凭据管理器中删除条目

问题描述 投票:5回答:2

我目前正在为Windows卸载程序中的所有用户实现“删除设置”,并且遇到了一个我甚至无法确定是否可以解决的问题。

应用程序使用CredentialManager(keymgr.dll)存储当前用户的凭据条目。让我们调用凭证“X”的目标。在卸载时,应删除所有用户存储的目标为“X”的凭据。卸载程序当然需要管理员权限,但我仍然觉得很难实现这一点。

对于当前用户,该命令通常通过cmdkey /delete=:X从命令提示符解决。据我所知,cmdkey.exe /list只能帮助列出当前用户的条目,并且无法从其他用户中删除本地条目。

我了解到凭据存储为C:\Users\_user_\AppData\Local\Microsoft\Credentials文件夹下的操作系统文件,但我不知道哪些文件是我要删除的条目,删除所有文件对其他应用程序都是危险的。此外,我认为删除操作系统文件将是危险的,并可能有限制(额外的UAC提示?)。

Runas命令是我得到的最接近的镜头,但因为它需要用户的密码,这变得非常困难,而不是我想要的卸载程序。我还需要一种方法来获取每个用户的用户名和域并迭代它们。

我更喜欢使用cmdpowershell

windows powershell cmd credential-manager
2个回答
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

我运行它并在本地清除它而无需以管理员身份运行(但我是本地管理员)


2
投票

从批处理文件或PowerShell命令运行时,cmdkey.exe实用程序可能会遇到与特殊字符相关的两个问题。 1.如果从批处理文件运行,如果凭证具有“(”或“)”而没有双引号,即左右paren,则不会删除该凭证。 2.如果凭证名称aka targetname具有由空格覆盖的连字符,则cmdkey将不会删除或创建具有该字符串“ - ”的凭证。

编写了一些PowerShell模块来尝试这样做,但我找到的唯一一个处理此异常的模块是在Github上https://github.com/bamcisnetworks/BAMCIS.CredentialManager

BAMCIS.CredentialManager

使用这个我能够创建凭据来设置带有parens或连字符的测试环境,但更重要的是通过使用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


  }
}
© www.soinside.com 2019 - 2024. All rights reserved.