J'implémente actuellement un "supprimer les paramètres" pour tous les utilisateurs dans un programme de désinstallation de Windows et je suis tombé sur un problème que je ne suis même pas sûr qu'il soit possible de résoudre.
L'application stocke les entrées d'informations d'identification de l'utilisateur actuel à l'aide de CredentialManager (keymgr.dll
). Appelons la cible des informations d'identification "X". Lors de la désinstallation, toutes les informations d'identification stockées avec la cible "X" doivent être supprimées sur tous les utilisateurs. Le programme de désinstallation nécessite bien sûr des privilèges d'administrateur, mais je trouve toujours très difficile d'y parvenir.
Pour l'utilisateur actuel, cette commande est généralement résolue via cmdkey /delete=:X
à partir d'une invite de commande. Pour autant que je sache cmdkey.exe /list
permet uniquement de répertorier les entrées de l'utilisateur actuel et ne peut pas supprimer les entrées locales d'un autre utilisateur.
J'ai appris que les informations d'identification sont stockées sous forme de fichiers OS sous C:\Users\_user_\AppData\Local\Microsoft\Credentials
dossier, mais je ne sais pas quels fichiers sont les entrées que je veux supprimer et tout supprimer serait dangereux pour d'autres applications. Je suppose également que la suppression des fichiers du système d'exploitation sera dangereuse et pourrait également avoir des limites (invite UAC supplémentaire?).
La commande Runas
est la prise de vue la plus proche que j'ai obtenue, mais comme elle nécessite le mot de passe de l'utilisateur, cela devient très difficile et ce n'est pas quelque chose que je souhaiterais dans le programme de désinstallation. J'aurais également besoin d'un moyen d'obtenir le nom d'utilisateur et le domaine pour chaque utilisateur et de les itérer.
Je préfère utiliser cmd
ou powershell
pour cela.
Je ne veux pas nécro un ancien post mais je devais le faire moi-même alors j'ai pensé que j'ajouterais ceci au cas où quelqu'un d'autre en aurait besoin:
cmdkey /list | ForEach-Object{if($_ -like "*Target:*" -and $_ -like "*Microsoft*"){cmdkey /del:($_ -replace " ","" -replace "Target:","")}}
Powershell une doublure qui supprimera toutes les informations d'identification avec Microsoft dans la chaîne.
Référence: https://Gist.github.com/janikvonrotz/781999
J'ai exécuté cela et il l'a purgé localement sans avoir besoin de s'exécuter en tant qu'administrateur (mais je suis un administrateur local)
L'utilitaire cmdkey.exe lorsqu'il est exécuté à partir d'un fichier de commandes ou d'une commande PowerShell peut rencontrer deux problèmes liés aux caractères spéciaux. 1. S'il est exécuté à partir d'un fichier de commandes, si les informations d'identification contiennent "(" ou ")" sans les guillemets doubles, c'est-à-dire les parenthèses gauche et droite, ces informations d'identification ne seront pas supprimées. 2. Si le nom d'informations d'identification aka targetname, a un trait d'union entouré d'espaces, la cmdkey ne supprimera pas ou ne créera pas d'informations d'identification avec cette chaîne "-".
Il y a quelques modules PowerShell écrits pour essayer de le faire, mais le seul que j'ai trouvé qui gère ces exceptions était sur Github https://github.com/bamcisnetworks/BAMCIS.CredentialManager
BAMCIS.CredentialManager
À l'aide de cela, j'ai pu créer des informations d'identification pour configurer un environnement de test avec des parenthèses ou des tirets, mais plus important encore pour les supprimer en rassemblant la liste d'utilisateurs des informations d'identification mises en cache à l'aide de la commande modules, puis en transmettant les informations de la commande à la commande remove pour supprimer TOUTES les informations d'identification mises en cache.
Une mise en garde. Après avoir supprimé la commande, après un certain temps, deux informations d'identification mises en cache réapparaissent dynamiquement.
Donc, pour résoudre les problèmes fréquents de verrouillage des utilisateurs, je vais essayer de déployer cela en utilisant SCCM dans le contexte de l'utilisateur à la fermeture de session. Sinon, un redémarrage du système après la suppression des informations d'identification peut être nécessaire. Voici un script prototype qui importe le module et l'utilise ensuite pour supprimer toutes les informations d'identification mises en cache, comme toujours, testez, testez, testez et utilisez à vos risques et périls!
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
}
}
Lot, invite cmd élevée:
Pour trouver les principaux, répertorie tout avec MS.O, Micro et équipes :
for /f "tokens=1-4 Delims=:=" %A in ('cmdkey /list ^| findstr Target: ^| findstr /i "MS.O Micro Teams"') do @echo %D
Ceci supprime toutes les entrées pour les équipes :
for /f "tokens=1-4 Delims=:=" %A in ('cmdkey /list ^| findstr /i teams') do @cmdkey /delete:%D
Si vous souhaitez l'inclure en tant que script, la syntaxe sera légèrement différente. Doublez le %% A %% D vars