Удалить запись из диспетчера учетных данных для всех пользователей в Windows

Вопрос:

В настоящее время я выполняю “удаление настроек” для всех пользователей в деинсталляторе Windows и попал в проблему, которую я даже не уверен в возможности решить.

Приложение сохраняет записи учетных данных для текущего пользователя с помощью CredentialManager (keymgr.dll). Позвольте называть цель учетных данных “X”. При удалении все учетные данные, хранящиеся с целевым “X”, должны быть удалены для всех пользователей. Конечно, для деинсталлятора требуются права администратора, но все же мне очень сложно выполнить это.

Для текущего пользователя эта команда обычно разрешается с помощью команды cmdkey/delete=:X из командной строки. Насколько мне известно, cmdkey.exe/list помогает только перечислять записи для текущего пользователя и не может удалять локальные записи от другого пользователя.

Я узнал, что учетные данные хранятся в виде файлов ОС в папке C:\Users\_user_\AppData\Local\Microsoft\Credentials, но я не могу знать, какие файлы являются записями, которые я хочу удалить, и удаление всех будет опасным для других применений. Также я предполагаю, что удаление файлов ОС будет опасным и может иметь ограничения (дополнительное приглашение UAC?).

Команда Runas – это самый близкий выстрел, который я получил, но поскольку для пользователя требуется пароль пользователя, это становится очень сложным, а не тем, что я хочу в деинсталляторе. Мне также нужен способ получить имя пользователя и домен для каждого пользователя и повторить их.

Я бы предпочел использовать для этого cmd или powershell.

Ответ №1

Не хочу, чтобы некропольский старый пост, но мне нужно было сделать это самостоятельно, поэтому я решил, что добавлю это на тот случай, если кому-то еще это понадобится:

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

Я запускал это, и он очищал его локально, без необходимости запускаться как admin (но я локальный администратор)

Ответ №2

При запуске утилиты cmdkey.exe из командного файла или команды PowerShell могут возникнуть две проблемы, связанные со специальными символами. 1. При запуске из командного файла, если учетные данные имеют “(” или “)” без двойных кавычек, то есть левое и правое объединение, эти учетные данные не будут удалены. 2. Если в имени учетной записи, известном как targetname, есть дефис, окруженный пробелами, 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


}
}

Ответ №3

Пакетное, повышенное cmd подскажите:

Чтобы найти основные из них, перечислите любые с MS.O, Micro и командами:

для /f “токены = 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 команды’) do @cmdkey/delete:% D

Если вы хотите включить это как скрипт, синтаксис будет немного другим. Удвойте %% A %% D в

Ответ №4

Джон С. – это отличный ответ, но утверждение “за” можно немного отточить. Поскольку нам нужен только текст после знака “=”, мы можем упростить его, чтобы разделить каждую строку только на две части со знаком “=” (вместо четырех, используя двоеточия и “=”), и отправлять только вторую часть в команду.

for /f "tokens=2 Delims==" %A in ('cmdkey /list ^| findstr Target: ^| findstr /i "teams"') do @echo %A

По крайней мере, это мой взгляд на это. Может я что то пропустил?

Оцените статью
TechArks.Ru
Добавить комментарий