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

时间:2016-09-13 19:54:24

标签: windows powershell cmd credential-manager

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

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

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

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

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

我更倾向于使用cmdpowershell

3 个答案:

答案 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变量增加一倍