Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das MsDS-KeyCredentialLink-Attribut kann in PowerShell angezeigt werden. Der Wert befindet sich jedoch im Binärformat und kann nicht gelesen werden. Dieses Skript hilft Ihnen bei den folgenden Aktionen:
- Aufzählen aller Benutzer in Active Directory (AD), die einen Wert ungleich NULL in msDS-KeyCredentialLink aufweisen.
- Extrahieren Sie den bcrypt-sha256-Schlüssel-ID-Hash jedes Zertifikats, das in msDS-KeyCredentialLink gespeichert ist, und speichern Sie es in einer Datei.
Anschließend können Sie mithilfe der gespeicherten Informationen überprüfen, ob sich die erwarteten Werte im msDS-KeyCredentialLink-Attribut des Benutzers befinden.
Script
Wichtig
Dieses Beispielskript wird unter keinem Microsoft-Standardsupportprogramm oder -dienst unterstützt.
Das Beispielskript wird AS IS ohne Jegliche Garantie bereitgestellt. Microsoft lehnt weiterhin alle konkludenten Garantien ab, einschließlich, ohne Einschränkung, jegliche konkludente Gewährleistung der Handelsmöglichkeit oder der Eignung für einen bestimmten Zweck.
Das gesamte Risiko, das sich aus der Verwendung oder Leistung der Beispielskripts und dokumentation ergibt, bleibt bei Ihnen. In keinem Fall haftet Microsoft, seine Autoren oder sonstigen Personen, die an der Erstellung, Produktion oder Lieferung der Skripts beteiligt sind, für jegliche Schäden (einschließlich, ohne Einschränkung, Schäden für Verlust von Geschäftsgewinnen, Geschäftsunterbrechungen, Verlust von Geschäftsinformationen oder anderen unbestimmten Verlusten), die sich aus der Verwendung oder Unfähigkeit ergeben, die Beispielskripts oder Dokumentation zu verwenden, auch wenn Microsoft über die Möglichkeit solcher Schäden informiert wurde.
Nachdem Sie das Skript ausgeführt haben, werden die Ergebnisse in der Datei "C:\temp\KeyCredentialLink-report.txt" gespeichert.
$outputfile = "C:\temp\KeyCredentialLink-report.txt"
New-Item -ItemType file -Path $outputfile -Force | Out-Null
"Report generated on " + (Get-Date) | Out-File $outputfile
# Enumerate all AD users that has a msds-KeyCredentialLink value
foreach ($user in (Get-ADUser -LDAPFilter '(msDS-KeyCredentialLink=*)' -Properties "msDS-KeyCredentialLink")) {
# For each user, output the UPN, DN, and all key IDs in msDS-KeyCredentialLink
"===========`nUser: $($user.UserPrincipalName)`nDN: $($user.DistinguishedName)" | Out-File $outputfile -Append
"KeyCredialLink Entries:" | Out-File $outputfile -Append
" Source|Usage|DeviceID |KeyID" | Out-File $outputfile -Append
" -------------------------------------------------------------------" | Out-File $outputfile -Append
foreach ($blob in ($user."msDS-KeyCredentialLink")) {
$KCLstring = ($blob -split ':')[2]
# Check that the entries are version 2
if ($KCLstring.Substring(0, 8) -eq "00020000") {
$curIndex = 8
# Parse all KeyCredentialLink entries from the hex string
while ($curIndex -lt $KCLstring.Length) {
# Read the length, reverse the byte order to account for endianess, then convert to an int
# The length is in bytes, so multiply by 2 to get the length in characters
$strLength = ($KCLstring.Substring($curIndex, 4)) -split '(?<=\G..)(?!$)'
[array]::Reverse($strLength)
$kcle_Length = ([convert]::ToInt16(-join $strLength, 16)) * 2
# Read the identifier and value
$kcle_Identifier = $KCLstring.Substring($curIndex + 4, 2)
$kcle_Value = $KCLstring.Substring($curIndex + 6, $kcle_Length)
switch ($kcle_Identifier) {
# KeyID
'01' {
$KeyID = $kcle_Value
}
# KeyUsage
'04' {
switch ($kcle_Value) {
'01' { $Usage = "NGC " }
'07' { $Usage = "FIDO " }
'08' { $Usage = "FEK " }
Default { $Usage = $kcle_Value }
}
}
# Source
'05' {
switch ($kcle_Value) {
'00' { $Source = "AD " }
'01' { $Source = "Entra " }
Default { $Source = $kcle_Value }
}
}
# DeviceID
'06' {
$tempByteArray = $kcle_Value -split '(?<=\G..)(?!$)'
$DeviceID = [System.Guid]::new($tempByteArray[3..0] + $tempByteArray[5..4] + $tempByteArray[7..6] + $tempByteArray[8..16] -join "")
}
}
$curIndex += 6 + $kcle_Length
}
# Save the data to file
" $Source|$Usage|$DeviceID|$KeyID" | Out-File $outputfile -Append
}
}
}
Skriptbeispielausgabe und -analyse
Hier ist eine Beispielausgabe des Skripts:
User: user1@contoso.com
DN: CN=user1,OU=MyOU,DC=contoso,DC=com
KeyCredialLink Entries:
Source|Usage|DeviceID |KeyID
-------------------------------------------------------------------
Entra |NGC |8a763ab0-0f6f-44f3-99ae-599a6aaca45b|FD68391824C44158B23C5605F567A588D02C4B2962AC96B789EDBCE091CF5067
Entra |NGC |9cf88f41-1e1e-462b-87d5-6938410ea82c|E91EF4E058513155A3F7E7E5B3E34951ADE923FFD0A7C24BB9957510F007E2F3
Entra |NGC |d04581fc-d1c8-45fc-a5ad-192bc649574f|E60B476088CC5CDF6FB75454CFA6E17C3059D51F2CA1E414E1554715BE6C0527
===========
User: user2@contoso.com
DN: CN=user2,OU=MyOU,DC=contoso,DC=com
KeyCredialLink Entries:
Source|Usage|DeviceID |KeyID
---------------------------
Entra |NGC |c8fcc7a6-8f3f-4ec7-a90b-49c6988ba3a4|32EF67B902CB498710F0091F5B10B6A4A2F05D621B748B8150E08FA3048F227F
Jeder KeyCredentialLink
Eintrag stellt ein Zertifikat dar. Die Ausgabe enthält die folgenden Informationen:
-
Source
: Die Quelle des Zertifikats. Diese Informationen können entweder aus der Microsoft Entra-ID oder dem lokalen AD stammen. -
Usage
: Die definierte Verwendung des Zertifikats. Diese Informationen können NGC (WHfB), FIDO oder FEK (Dateiverschlüsselungsschlüssel) sein. -
DeviceID
: Die ID des Computers, auf dem das Zertifikat erstellt wurde. Diese Informationen sind die Geräte-ID in Microsoft Entra ID und die objectGUID in AD. -
KeyID
: Der bcrypt-sha256-Schlüssel-ID-Hash des Zertifikats.
Das übereinstimmende Zertifikat sollte im persönlichen Zertifikatspeicher des Benutzers auf dem Computer mit dem entsprechenden Zertifikat DeviceID
gespeichert werden. Um das zertifikat zu finden, das auf dem Client verwendet wird, können Sie über eine PowerShell oder Eingabeaufforderung ausführen certutil -v -user -store my
, um detaillierte Zertifikatinformationen aus dem persönlichen Speicher des Benutzers abzubilden. In diesem Beispiel sollten Sie ein selbstsigniertes Zertifikat finden, bei dem der Betreff und der Aussteller identisch sind und in Form von CN=<User SID>/login.windows.net/<Tenant ID>/<user UPN>
. Nachdem Sie dieses Zertifikat gefunden haben, überprüfen Sie den bcrypt-sha256-Schlüssel-ID-Hash. Dieser Hashwert sollte mit einem der Einträge im MsDS-KeyCredentialLink-Attribut übereinstimmen.
Hier ist ein Auszug aus user2@contoso.comdem Zertifikatspeicher:
> certutil -v -user -store my
my "Personal"
================ Certificate 0 ================
X509 Certificate:
Version: 3
Serial Number: 184621…
Signature Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
Algorithm Parameters:
05 00
Issuer:
CN=S-1-5-21-394…7436/login.windows.net/ccf…83a/user2@contoso.com
:
Signature Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.11 sha256RSA
Algorithm Parameters:
05 00
Signature: UnusedBits=0
0000 19 17 8f 65 c1 e3 f1 0a 3b 62 90 7f fa 94 13 ad
// snip
00f0 a2 e3 72 54 a5 0a 84 30 9e 8b 81 19 d3 61 46 58
Signature matches Public Key
Root Certificate: Subject matches Issuer
Key Id Hash(rfc-sha1): 9a546…
Key Id Hash(sha1): d66eb…
Key Id Hash(bcrypt-sha1): 7f4a0…
Key Id Hash(bcrypt-sha256): 32ef67b902cb…