10

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

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

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

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

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

我更愿意使用其中一个cmdpowershell为此。

4

4 回答 4

18

不想删除旧帖子,但我需要自己做,所以我想我会添加这个以防其他人需要它:

cmdkey /list | ForEach-Object{if($_ -like "*Target:*" -and $_ -like "*microsoft*"){cmdkey /del:($_ -replace " ","" -replace "Target:","")}} 

Powershell 一个内衬,它将删除字符串中的任何 Microsoft 凭据。

参考: https ://gist.github.com/janikvonrotz/7819990

我运行了它,它在本地清除它而不需要以管理员身份运行(但我是本地管理员)

于 2017-08-03T17:36:04.293 回答
2

从批处理文件或 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


  }
}
于 2018-08-30T14:19:01.873 回答
0

遇到类似问题,清除未加入域的设备的旧凭据。创建登录任务以清除凭据。就我而言,我正在寻找特定的文件服务器,因此不要意外清除所有凭据。由于管道字符串表达式到任务时的语法问题,创建引用 .ps1 然后在任务中引用更容易。通过 Intune 推送此脚本....

# Full path of the file
$file = 'C:\script\clearcreds.ps1'
    
#If the file does not exist, create it.
if (-not(Test-Path -Path $file -PathType Leaf)) {
try {
$null = New-Item -Path "C:\ProgramData\CentraStage\Packages" -Name 
"clearcreds.ps1" -ItemType "file" -Value 'cmdkey /list | ForEach-Object{if($_ - 
         like "*Target:*" -and $_ -like "*fileserver*"){cmdkey /del:($_ -replace " ","" -replace "Target:","")}}'
Write-Host "The file [$file] has been created."
             }
         catch {
             throw $_.Exception.Message
         }
     }
#######################################
#Create ScheduledTask to Run at log on.
#######################################
$schtaskName = "Clear Cached Creds "
$schtaskDescription = "Clears Cached Creds for each user at logon."
$trigger = New-ScheduledTaskTrigger -AtLogOn
$class = cimclass MSFT_TaskEventTrigger root/Microsoft/Windows/TaskScheduler
#Execute task in users context
$principal = New-ScheduledTaskPrincipal -GroupId "S-1-5-32-545" -Id "Author"
$action3 = New-ScheduledTaskAction -Execute 'Powershell.exe' "-File C:\script\clearcreds.ps1"
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
$null=Register-ScheduledTask -TaskName $schtaskName -Trigger $trigger -Action   $action3  -Principal $principal -Settings $settings -Description 
$schtaskDescription -Force
Start-ScheduledTask -TaskName $schtaskName
于 2022-01-27T18:42:06.837 回答
0

批处理,提升的 cmd 提示符:

要找到主要的,请列出任何带有MS.O、Micro 和 team 的

for /f "tokens=1-4 Delims=:=" %A in ('cmdkey /list  ^| findstr Target: ^| findstr /i "MS.O Micro Teams"') do @echo %D

这将删除所有团队的条目:

for /f "tokens=1-4 Delims=:=" %A in ('cmdkey /list ^| findstr /i teams') do @cmdkey /delete:%D

如果您想将此作为脚本包含在内,则语法会略有不同。将 %%A %%D 变量加倍

于 2019-06-27T20:45:50.107 回答