web-dev-qa-db-ja.com

Windows上のすべてのユーザーの資格情報マネージャーからエントリを削除する

私は現在、Windowsアンインストーラーのすべてのユーザーに「削除設定」を実装していて、解決できるかどうかさえわからない問題を見つけました。

アプリケーションは、CredentialManager(keymgr.dll)を使用して現在のユーザーの認証情報エントリを保存します。クレデンシャルのターゲットを「X」と呼びましょう。アンインストール時に、ターゲット「X」で保存されたすべての資格情報をすべてのユーザーから削除する必要があります。もちろん、アンインストーラーには管理者特権が必要ですが、それでも、これを達成するのは非常に困難です。

現在のユーザーの場合、そのコマンドは通常、コマンドプロンプトからcmdkey /delete=:Xを介して解決されます。私の知る限り、cmdkey.exe /listは現在のユーザーのエントリを一覧表示するのにのみ役立ち、ローカルエントリを別のユーザーから削除することはできません。

資格情報がOSファイルとしてC:\Users\_user_\AppData\Local\Microsoft\Credentialsフォルダーに保存されていることを知りましたが、どのファイルを削除したいのかわからず、他のアプリケーションではすべて削除すると危険です。また、OSファイルの削除は危険であり、制限(追加のUACプロンプト?)が発生する可能性もあると思います。

Runasコマンドは私が得た最も近いショットですが、それはユーザーのパスワードを必要とするため、アンインストーラーで必要なものではなく非常に難しくなります。また、各ユーザーのユーザー名とドメインを取得し、それらを繰り返す方法も必要です。

これにはcmdまたはpowershellを使用したいと思います。

7
Pettor

古い投稿を壊したくないのですが、私は自分でこれを行う必要があったので、他の誰かがそれを必要とする場合に備えて、これを追加すると思いました。

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

文字列内のMicrosoftの資格情報を削除するPowershellワンライナー。

参照: https://Gist.github.com/janikvonrotz/781999

私はこれを実行し、管理者として実行する必要なくローカルでパージしました(ただし、私はローカル管理者です)

13
Jebuz

Cmdkey.exeユーティリティをバッチファイルまたはPowerShellコマンドから実行すると、特殊文字に関連する2つの問題が発生する場合があります。 1.バッチファイルから実行する場合、資格情報に二重引用符のない "(​​"または ")"があり、それが左右の括弧である場合、その資格情報は削除されません。 2.資格情報の名前がtargetnameで、スペースがハイフンで囲まれている場合、cmdkeyはその文字列「-」を持つ資格情報を削除または作成しません。

これを試して実行するために記述されたいくつかのpowershellモジュールがありますが、この例外を処理することがわかったのはGithubだけでした https://github.com/bamcisnetworks/BAMCIS.CredentialManager

BAMCIS.CredentialManager

これを使用して、括弧またはハイフンを使用してテスト環境をセットアップするための資格情報を作成できましたが、より重要なのは、modulesコマンドを使用してキャッシュされた資格情報のユーザーリストを収集し、コマンドの情報を削除コマンドに渡して、キャッシュされたすべての資格情報を削除します。

1つの警告。コマンドを削除した後、しばらくすると、キャッシュされた2つの資格情報が動的に再表示されます。

したがって、頻繁に発生するユーザーロックアウトの問題に対処するには、ログオフ時にユーザーコンテキストで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
DeployGuy

バッチ、昇格されたcmdプロンプト:

主なものを見つけるには、MS.O、Micro、およびteamsを使用してリストします。

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

これはdeletesteamsのすべてのエントリです:

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

これをスクリプトとして含める場合、構文は少し異なります。 %% A %% D変数を2倍にします

0
John c