All notable changes to this project will be documented in this file.
- New guidance section 10: Windows Server 2025 & Kerb3961 Library — covers Server 2025 DC behavioral changes (no RC4 TGTs, no implicit fallback, legacy registry ignored, DES removed)
- "Three Criteria for Impact" emergency triage framework in guidance section 7 and README — identifies the three conditions that must ALL be met for enforcement to break a service ticket request
- KDCSVC events 201-209 TGS-only clarification in event reference table, guidance, and FAQ
- Phase 3 (July 2026) escape hatches documented: per-account msDS-SupportedEncryptionTypes and per-DC DefaultDomainSupportedEncTypes
- Four new FAQ entries (EN + DE): Three Criteria, Server 2025 Kerb3961, KDCSVC TGS-only, July 2026 recovery options
- .gitignore: exclude internal reference PDF from version control
- Guidance sections renumbered from 11 to 12 (new section 10 inserted)
- Get-KdcRegistryAssessment: "not set" detail text now mentions July 2026 escape hatches
- Get-KdcSvcEventAssessment: event reference table now notes TGS-only scope
Major finding: msDS-SupportedEncryptionTypes controls Kerberos ticket
negotiation only — it does NOT control which credential keys (hashes) are
stored in the Active Directory database. On any Domain Controller with
DFL >= 2008 (since Windows Server 2008), AES keys are always generated
during password set/change, regardless of this attribute's value.
This was confirmed through:
- Independent testing by Friedrich (colleague) on Windows Server 2025 —
setting
msDS-SupportedEncryptionTypesto0x07(DES+RC4 only) or0x27(DES+RC4+AES-SK) still resulted in all AES keys being generated in the DB - DSInternals source
code (
KerberosCredentialNew.cs) — AES SHA1 key derivation is unconditional (labeled "Windows Server 2008+"), with nomsDS-SupportedEncryptionTypesinput - Event 4768 v2
(post January 2025 CU) — new
AccountAvailableKeysfield shows actual keys stored in the DB, separate fromAccountSupportedEncryptionTypes - MS-KILE protocol specification — key generation is tied to DFL, not per-account attribute
Root cause for RC4-only keys in the DB:
- Migrated accounts (e.g. ADMT) — only the NT hash is injected during cross-forest migration, without AES key generation
- Passwords set before DFL was raised to 2008 — AES key derivation was not available at that time
This is NOT a Windows Server 2025-specific behavior. It has been true since Server 2008 (DFL 2008). The new Event 4768 v2 fields simply make it visible.
- All "RC4-only encryption configured" messages now say "RC4-only ticket negotiation configured" to clarify the attribute's actual scope
- "Missing AES Keys" detection (Section 9) now explains that
msDS-SupportedEncryptionTypesis irrelevant to key storage; accounts are flagged based on password age (predating DFL 2008) or migration status - Path A (explicit non-AES attribute) now also requires the password to predate the AES threshold — accounts with recent passwords have AES keys in the DB regardless of this attribute
- AES/RC4 event log correlation now explains 3 possible causes: migrated accounts, pre-DFL-2008 passwords, or client-side RC4 preference
- Guidance text (Sections 8a, 9) recommends verifying actual keys with
DSInternals
Get-ADReplAccountor Event 4768 v2AccountAvailableKeysbefore remediation - Recommendation fix commands clarify that password reset on DFL >= 2008 always generates AES keys automatically
- FAQ (EN + DE) updated with correct explanation of key storage vs. ticket negotiation, including DSInternals and Event 4768 v2 references
- README.md and QUICK_START.md updated throughout
- DFL detection regex now uses negative match (
-notmatch 'Windows2000|Windows2003') instead of fragile positive match — future-proof for any DFL >= 2008 - Eliminated redundant
Get-ADDomaincall in Missing AES Keys section — now reuses$domainInfoalready fetched at function start - Test mocks now include
DomainSIDproperty to match the optimized code path
- DSInternals PowerShell Module
—
Get-ADReplAccountreveals actualSupplementalCredentials(Kerberos keys) stored in the AD database - DSInternals KerberosCredentialNew.cs — Source code showing AES key derivation is unconditional on DFL >= 2008
- Event 4768 documentation
— Updated post January 2025 CU with
AccountAvailableKeysandAccountSupportedEncryptionTypesas separate fields - MS-KILE Section 2.2.7 — Supported Encryption Types Bit Flags specification
- GPO-vs-AD etype drift detection in
Get-KdcRegistryAssessment— readsSupportedEncryptionTypesfrom the GPO Policies registry path on each DC and compares against the DC'smsDS-SupportedEncryptionTypesAD attribute to detect pending Kerberos service restarts or manual overrides (#31) - Etype drift tracking in
Invoke-RC4AssessmentComparison— shows drift DC count changes between baseline and current assessments (#31)
Get-KdcRegistryAssessmentfalls back to local registry read whenInvoke-Commandfails on the DC the tool is running on (loopback WinRM cold-start issue)- GPO
SupportedEncryptionTypesvalue0x80000018(2147483672) causedInt32overflow — now uses[long]before stripping the high bit - Local fallback and remote DC failure messages now show the actual error for diagnostics
DefaultDomainSupportedEncTypeswith RC4 now reported as WARNING instead of OK/INFO — DDSET with RC4 overrides enforcement for ALL accounts without explicitmsDS-SupportedEncryptionTypes, not just per-account exceptions (#34)- Clarified that per-account RC4 exceptions (
0x1C) do NOT require DDSET to include RC4
- FAQ (DE):
RC4DefaultDisablementPhasetable updated — added "Not set" row, corrected Phase 0/1 descriptions, fixed "Kein Neustart" to "KDC-Neustart erforderlich" (#26, #28, #29) - FAQ (DE/EN): Added KB5073381 note that explicit DDSET overrides implicit enforcement default (#32)
- Guidance text:
RC4DefaultDisablementPhaseregistry path corrected fromServices\Kdcto Policies path (#23) - Guidance text: Phase 0/1 descriptions updated for post-April 2026 semantics (#28, #29)
- Context-aware
Get-EncryptionTypeStringwith-Contextparameter (msds,ddset,gpo) — same bitmask is now decoded differently per context (#30) - AES256-HMAC-SK (bit
0x20) decoding inGet-EncryptionTypeString(#25) - Feature flag decoding (bits 16-19: FAST, Compound-Identity, Claims,
Resource-SID-Compression) for
msdscontext - Enforcement block detection (
TicketEncryptionType = 0xFFFFFFFF) inGet-TicketEncryptionTypeandGet-EventLogEncryptionAnalysiswith per-DC counter and affected-account tracking (#27)
Get-KdcRegistryAssessmentreadsRC4DefaultDisablementPhasefrom the correct Policies registry path instead ofServices\Kdc(#23)Get-AccountEncryptionAssessmentRODC group lookup uses well-known RID 521 instead of English display name — works on non-English DCs (#24)RC4DefaultDisablementPhaseassessment messages updated for post-April 2026 semantics:not set= implicit enforcement, Phase 0/1 = rollback states (#28)- Phase 1 description clarifies per-request KDCSVC event logging (#29)
- GPO encryption type callers pass
-Context gpo, DDSET callers pass-Context ddsetfor accurate bitmask decoding
Get-EncryptionTypeStringno longer labels bit 31 as "Future" universally — "Future encryption types" at the GPO level is bits 5-30 (0x7FFFFFE0), not bit 31 (#30)- README/FAQ/QUICK_START: "No reboot required" corrected to "KDC restart
required" for
RC4DefaultDisablementPhase(#26) - README/FAQ: Phase value table updated —
not setis now enforcement (not same as 0) after April 2026 CU (#28) - QUICK_START: Registry path in remediation snippet corrected to Policies path (#23)
- Missing AES Keys Path B now uses a dynamic AES threshold date derived from the "Read-only Domain Controllers" group creation date (proxy for DFL 2008 upgrade) instead of a hardcoded 5-year password age heuristic
- Falls back to Windows Server 2008 GA date (2008-02-27) when the RODC group is absent
- Displays the detected AES threshold date as an INFO finding during assessment
- PS 5.1 parse error caused by em-dash (U+2014) in string literal corrupting to
a]"after ModuleBuilder BOM stripping -- replaced with ASCII-- - Missing
Set-ADServiceAccountcaveat on the "Missing AES Keys" remediation command - Added
Get-ADGroupmock toRC4-ADAssessment.Tests.ps1Missing AES Keys tests for correct dynamic threshold resolution in CI
- RODC (Read-Only Domain Controller) assessment support in
Get-DomainControllerEncryption: tracksRODCCountandIsReadOnlyper DC, displays[RODC]label in console output - RODC KRBTGT account (
krbtgt_*) discovery and assessment inGet-AccountEncryptionAssessment: checks password age (CRITICAL >365d, WARNING >180d) and detects RC4-only encryption - RODC KRBTGT summary table in
Show-AssessmentSummarywith color-coded status and password rotation guidance - Null-safety for environments without RODCs — all RODC counters default to zero
- 9 new Pester unit tests for RODC DC detection, RODC KRBTGT discovery, password age, encryption type checks, and no-RODC scenarios (524 total tests, 67.69% coverage)
- Banner version in all three public commands (
Invoke-RC4Assessment,Invoke-RC4ForestAssessment,Invoke-RC4AssessmentComparison) now dynamically reads the module version from the manifest at import time, so the displayed version always matches the installed release Invoke-RC4ForestAssessmentandInvoke-RC4AssessmentComparisonbanners were missing the version number entirely- Removed stale
CHANGELOG-Surface_Laptop7.mdduplicate file
- Remediation commands now note that gMSA/sMSA/dMSA require
Set-ADServiceAccountinstead ofSet-ADUser(which cannot find Managed Service Account objects). Added to all inline fix commands inInvoke-RC4Assessment,-IncludeGuidanceoutput (Show-ManualValidationGuidance), and exported guidance text (Get-GuidancePlainText). Also clarifies that MSA passwords are managed by AD — no manualSet-ADAccountPasswordreset is needed; AES keys are generated at the next automatic password rotation. Computer accounts already correctly useSet-ADComputer.
- "RC4 tickets detected in event logs" downgraded from CRITICAL to WARNING — RC4 tickets may
originate from intentional
0x1Cexception accounts that will continue functioning after July 2026 enforcement - "Missing AES keys" upgraded from WARNING to CRITICAL — accounts with no AES keys (explicit non-AES encryption or very old passwords predating AES key generation) will break after enforcement phase
- Pester unit tests for
Invoke-RC4ForestAssessmentcovering forest discovery, sequential domain assessment, parameter forwarding, DC hostname extraction, status aggregation, export logic, and error handling paths
- Azure Pipelines now publishes JaCoCo code coverage as a visual report tab
- Pipeline ensures
testResults/directory exists before publishing artifacts
- KDCSVC event query now matches both provider names (
KDCSVCandMicrosoft-Windows-Kerberos-Key-Distribution-Center). Some Windows Server versions log KDC events 201-209 under the latter provider, causing the assessment to report zero events even when events exist.
- Azure Pipelines now publishes JaCoCo code coverage as a visual report tab (not just a downloadable artifact)
- Export filenames in multi-forest scans now contain the correct assessed domain name instead
of the caller's (logged-in user's) domain.
Invoke-DomainAssessmentomitted-Domainwhen passing-Server, causingInvoke-RC4Assessmentto fall back to(Get-ADDomain).DNSRoot. Invoke-RC4Assessmentnow resolves the domain name from the target server when only-Serveris provided (defense-in-depth)
- Forest summary exports (
Forest_Assessment_*.json|csv) now go to theExports/subfolder, consistent with per-domain exports
- Human-readable direction labels in trust assessment details (e.g.
3 (Bidirectional),2 (Outbound)) replacing raw integer values TrustDirectionmapping handles both integer and string enum values fromGet-ADTrust- 2 new Pester tests for direction label output (total: 494 tests)
RC4DefaultDisablementPhase = 1recommendation text incorrectly stated it "enables KDCSVC audit events". KDCSVC events are logged by the January 2026+ security update regardless of the phase value. Phase 1 is an administrative checkpoint for change management, not a technical gate for event logging. Only phase 2 changes KDC behaviour (enforcement).- Updated recommendation text in
Invoke-RC4Assessment,Get-KdcRegistryAssessment, and sample outputs inQUICK_START.mdandREADME.md
- KDCSVC note incorrectly stated events require
RC4DefaultDisablementPhase >= 1to be logged. KDCSVC events are generated by the January 2026+ security update regardless of the phase setting. The phase controls enforcement, not logging.
- Missing AES Keys detection rewritten with two-path approach:
- Path A: Accounts with
msDS-SupportedEncryptionTypesexplicitly set to a non-zero value without AES bits (e.g.,0x4= RC4-only,0x3= DES-only). Detected regardless of password age. - Path B: Accounts with attribute not set (null/0) AND password older than 5 years (may predate DFL 2008 upgrade). Original logic, now scoped correctly.
- Path A: Accounts with
- Standard scan now detects RC4-only and DES-only accounts without
-DeepScan -DeepScannow focuses on RC4-exception/DES-enabled users without SPNs and computer accounts- Summary label changed from "Accounts Missing AES Keys (pwd >5yr)" to "Accounts Missing AES Keys"
- 4 new unit tests for Path A, Path B, and negative case (AES bits present) (total: 492 tests)
-IncludeGuidancesection 9 updated with Path A/B detection explanation and separate queries- "Standard Scan vs DeepScan" comparison table in README
- Real-world example in README showing Path A detection without
-DeepScan
- Event log analysis incorrectly reported DCs as "Failed" (red) when no 4768/4769 events
existed in the time window.
Get-WinEventthrows "No events were found that match the specified selection criteria" which was caught as a query failure instead of an empty result. DCs now correctly appear as "Success" with zero event counts. - Empty event array check now uses
@($events).Count -eq 0for PowerShell 5.1/7 consistency - Fixed
PSUseBOMForUnicodeEncodedFilePSScriptAnalyzer warning onGet-EventLogEncryptionAnalysis.ps1
- 2 new unit tests for "no events found" handling (total: 488 tests)
- Track
SessionKeyEncryptionTypealongsideTicketEncryptionTypein event log analysis, following Microsoft'sGet-KerbEncryptionUsage.ps1pattern (Kerberos-Crypto) - New counters:
SessionKeyRC4,SessionKeyDES,SessionKeyAES,RC4SessionKeyAccounts RC4 SessKeycolumn in per-DC summary table and forest summary tableRC4 Session Keyscomparison line inInvoke-RC4AssessmentComparison(backward-compatible with older JSON exports)- Detect old event format (pre-January 2025 cumulative update) and show informational message instead of misleading zeros
- 6 new unit tests for session key tracking (total: 486 tests)
- GPO recommendation text now includes Future encryption types alongside AES128_HMAC_SHA1 and AES256_HMAC_SHA1, per CIS Benchmark 2.3.11.4
Get-EncryptionTypeStringrecognises the0x80000000(Future encryption types) bit- Updated guidance in
Get-GuidancePlainTextandShow-ManualValidationGuidanceGPO Validation sections - Updated DeepScan inline info message to reference Future encryption types
Invoke-RC4ForestAssessmentcrashed withSplit-Path: Cannot bind argument to parameter 'Path' because it is nullandRC4_DES_Assessment.ps1 not foundwhen running as a module function because legacy standalone-script path validation used$MyInvocation.MyCommand.Path(null for module functions) and referenced an undefined$assessmentScriptvariable- Sequential domain processing in
Invoke-RC4ForestAssessmentinvoked& $ScriptDir @paramsinstead of callingInvoke-RC4Assessmentdirectly (the parallel code path was already correct)
- Renamed module from
RC4ADChecktoRC4-ADAssessmentto match the repository name - Migrated build pipeline to Sampler framework with ModuleBuilder, InvokeBuild, and Pester 5
- Restructured project layout to Sampler conventions (source/Public, source/Private)
- Added QA tests for module quality, help content, and changelog validation
- Recommended Workflow section: replaced ASCII art with Mermaid flowchart diagram and command reference table
- Module Commands table listed 12 private functions as user-callable commands -- now shows only the 3 exported commands
- Internal Function Mapping incorrectly marked 12 private functions as "Public" -- corrected to "Private"
- Project Structure file counts: Public 16 -> 3, Private 8 -> 20, Unit 29 -> 27
- Test count: 407 tests across 29 files -> 344 tests across 28 files
- Duplicate "Reset service account passwords" line in Recommended Workflow
- Folder casing
tests/->Tests/in Project Structure diagram - QUICK_START.md sample output version
v2.4.0->v2.9.0
- AES-configured but RC4-used correlation (major feature): New
PasswordResetNeededdetection cross-references event log RC4 accounts (Event IDs 4768/4769) with AD accountmsDS-SupportedEncryptionTypesto identify accounts that have AES configured but are still issuing RC4 tickets because their password was never reset to generate AES keys- Accounts using RC4 tickets that are NOT in the RC4-only/DES-only/DES-flag lists are looked up in AD
- If account has AES bits set (0x8/0x10) or inherits AES default (attribute not set), flagged as "Password Reset Needed"
- New
PasswordResetNeededarray inEventLogsassessment output with account name, encryption config, password age, and reason - Inline display during event log analysis with actionable password reset command
Show-AssessmentSummarydisplays PasswordResetNeeded accounts in EVENT LOG ANALYSIS SUMMARY section- Overall assessment generates WARNING recommendation with FGPP workaround reference
Compare-Assessments.ps1tracksPasswordResetNeededcount changes between assessmentsAssess-ADForest.ps1aggregates PasswordResetNeeded counts in forest-wide event statistics- JSON export includes full PasswordResetNeeded details (no CSV change — event log data remains JSON-only)
- New Pester test: verifies
PasswordResetNeededproperty is initialized as empty array - Compare-Assessments tests updated with PasswordResetNeeded test data and reduction detection test
- Event log deserialization fix: Fixed critical bug where
Invoke-Commandreturned deserializedEventLogRecordobjects that lost theirToXml()method, causing event log analysis to report 0 AES/RC4/DES tickets despite retrieving thousands of events- Event XML is now parsed inside the
Invoke-Commandscriptblock on the remote DC whereToXml()is available - Returns lightweight
PSCustomObjects with pre-extractedTargetUserName,TicketEncryptionType, andServiceNamefields - RPC fallback path continues to use native
ToXml()on localEventLogRecordobjects
- Event XML is now parsed inside the
- Guidance text file export: When both
-ExportResultsand-IncludeGuidanceare used together, a plain-text guidance file (DES_RC4_Guidance_<domain>_<timestamp>.txt) is exported alongside JSON and CSV- Clean plain text without Unicode decorators — suitable for sharing, tickets, or offline reference
- Includes assessment context header (domain, date, tool version)
- All 11 guidance sections: audit setup, SIEM queries, GPO validation, KRBTGT rotation, RC4 exception workflow, FGPP workaround, keytab impact, monitoring schedule, and reference links
- Exported to the same
Exports/folder as JSON/CSV files
- Per-DC event counts in summary table: Fixed EVENT LOG ANALYSIS SUMMARY table displaying aggregate totals on every DC row instead of per-DC counts
- New
PerDcStatshashtable tracks EventsAnalyzed, RC4Tickets, DESTickets, AESTickets per Domain Controller - Aggregate totals in summary line and JSON export remain unchanged
Compare-Assessments.ps1unaffected (uses aggregate totals only)
- New
- KDCSVC event reference table: New reference table documenting Event IDs 201–209 with descriptions and recommended actions
- gMSA/sMSA creation guide: Step-by-step guidance for creating Group and Standalone Managed Service Accounts
- lastLogonTimestamp for all flagged accounts: All detected accounts (Missing AES keys, RC4-only, DES-only, DES-enabled, RC4 exception, stale password, USE_DES_KEY_ONLY, RC4-only MSAs) now include
lastLogonTimestampto determine if accounts are still actively in use- New
ConvertFrom-LastLogonTimestamphelper function (FileTime Int64 to DateTime conversion) - AD queries for SPN service accounts, MSAs, and DES flag accounts include
lastLogonTimestamp - New fields in all account info objects:
LastLogon(DateTime),LastLogonDaysAgo(int) - Inline display shows last logon date for each flagged account
- New
Last Logoncolumn in KRBTGT & Account Encryption Summary table - CSV/JSON export includes
LastLogonandLastLogonDaysAgocolumns for all account types - Recommendations include last logon date per account for triage prioritization
- New
- Fine-Grained Password Policy (FGPP) workaround guidance: New Section 9b in manual guidance documents the zero-disruption approach to generating AES keys by using a temporary FGPP that disables password history, allowing service account passwords to be reset with the same value
- Step-by-step: create temporary FGPP, apply to account, reset password, replicate, remove FGPP
- Based on real-world field experience with
sccmserviceand Cluster accounts
- Explicit AES enforcement guidance: New Section 9c documents that in some cases, resetting the password alone is not sufficient — you must explicitly set
msDS-SupportedEncryptionTypesto0x18(AES-only) and then reset the password again to force AES key generation- Before/after Event ID 4768 examples showing the difference between RC4-only and AES-enabled
- Clarifies that
Available Keys: AES-SHA1, RC4is expected (AD always stores RC4 keys)
- Missing AES key accounts added to summary table: These accounts now appear in the KRBTGT & Account Encryption Summary table alongside other account types
- AzureADKerberos key rotation guidance: Summary table now displays key rotation reminder with
Set-AzureADKerberosServer -RotateServerKeyand link to Microsoft documentation- Fixed broken "Cloud Kerberos Trust deployment" link in README.md (old URL returned 404)
- Updated to correct URLs: Windows Hello for Business cloud Kerberos trust deployment guide and Passwordless security key sign-in
- Added note that Entra Kerberos
krbtgtkeys should be rotated on the same schedule as AD DCkrbtgtkeys
- 2 new Pester tests for lastLogonTimestamp handling (with and without logon data)
- SYSVOL GPO detection fallback fix: Fixed
Get-DomainControllerEncryptionSYSVOL fallback path failing silently whenGet-ADObjectwas not available as a mockable command in test environments- Added
Get-ADObjectstub to Pester test harness alongside existing AD cmdlet stubs - Fixed Pester mock parameter type mismatch:
$Identitybound asADComputerobject caused$Identity -eq 'string'comparisons to fail; resolved by using string interpolation ("$Identity") in mock bodies - All 204 Pester tests now pass on machines without the ActiveDirectory module
- Added
- Linux / Kerberos keytab impact guidance: New subsection in KRBTGT rotation procedure warning that password rotation invalidates keytab files for Linux services (Apache, Nginx, SSSD, Samba, PostgreSQL, IBM WebSphere, etc.)
ktpass(Windows) andktutil(Linux) keytab regeneration commands with AES256 examples- Verification step:
kinit -kt /etc/krb5.keytab <principal> - Troubleshooting: check
msDS-SupportedEncryptionTypesincludes0x10(AES256) and password was reset after setting encryption type - Reference links: AD Hardening Series Part 4, keytab creation guide,
ktpasscommand reference, Samuraj RC4-to-AES migration guide
- Service account remediation keytab warning: Inline reminder in Section 6 service account update commands that Linux services using keytabs must regenerate them after encryption type changes and password resets
- KRBTGT rotation recommendation keytab notes: Inline keytab impact comments added to KRBTGT rotation fix commands in overall assessment recommendations
- DC discovery refactored to
Get-ADDomainController -Filter *: All functions now use the authoritative DC Locator (Configuration partition) instead of querying theOU=Domain ControllerscontainerGet-ADDomainController -Filter *returns only registered DCs from NTDS Settings — no false positives from non-DC objects in the OU, no false negatives from DCs moved out of the default OU- AzureADKerberos filtering removed from
Get-KdcRegistryAssessment,Get-KdcSvcEventAssessment,Get-AuditPolicyCheck,Get-EventLogEncryptionAnalysis— no longer needed sinceGet-ADDomainControllernever returns the proxy object - AzureADKerberos detection in
Get-DomainControllerEncryptionnow uses a targetedGet-ADComputer -Identity 'AzureADKerberos'lookup instead of filtering a full OU query - Per-DC encryption properties (
msDS-SupportedEncryptionTypes,OperatingSystem) read viaGet-ADComputerusingComputerObjectDNfrom the DC Locator result - GPO inheritance check (
Get-GPInheritance) still uses the DC OU path (required by the cmdlet)
- No breaking changes to JSON/CSV export format: Compare-Assessments.ps1 works unchanged with v2.6.0 and v2.7.x exports
- Updated Pester tests to mock
Get-ADDomainController -Filter *for DC discovery across all assessment functions
- AES-first hardening: All default fix commands now use
0x18(AES-only) instead of0x1C0x1C(RC4 + AES) is now only recommended as a documented fallback when AES breaks an application- Aligns with July 2026 enforcement: only accounts with explicit RC4 in
msDS-SupportedEncryptionTypescan still use RC4
- RC4 exception account detection: Accounts with explicit RC4 + AES (
0x1Cor any value with both RC4 and AES bits) are now flagged as WARNING- Detected across SPN service accounts (
Get-ADUser) and gMSA/sMSA/dMSA (Get-ADServiceAccount) - New properties:
RC4ExceptionAccounts,TotalRC4Exceptionin assessment output - Summary line, summary table row, recommendation with hardening commands, CSV/JSON export
- Compare-Assessments.ps1: tracks RC4 exception count changes between assessments
- Detected across SPN service accounts (
- Updated guidance: Section 8 (RC4 Exception Workflow) restructured with AES-first approach and clear "last resort" language for RC4 exceptions
- DefaultDomainSupportedEncTypes: Fix commands now recommend per-account
0x1Cexceptions instead of domain-wide0x1C(which leaves all accounts vulnerable to CVE-2026-20833) - 8 new Pester tests for RC4 exception detection and comparison logic
- AzureADKerberos exclusion refinement: Explicit filtering of AzureADKerberos from DC list in KDC registry and KDCSVC event log queries
- DES-enabled account detection: Accounts with DES encryption bits set alongside AES are now flagged as WARNING (DES removed in Server 2025)
- Detects DES bits on SPN user accounts (
Get-ADUserwith SPN filter) and gMSA/sMSA/dMSA (Get-ADServiceAccount)\n- dMSA support: Delegated Managed Service Accounts (Windows Server 2025,msDS-DelegatedManagedServiceAccount) are now correctly identified as "dMSA" instead of "sMSA" - Summary line, summary table row, recommendation with fix commands, CSV/JSON export, and Compare-Assessments comparison
- 5 new Pester tests for DES-enabled detection scenarios
- Detects DES bits on SPN user accounts (
- Fixed: Explicit RC4 exception value corrected from
0x24to0x1C(RC4 + AES128 + AES256) —0x20is compound identity/FAST armor, not AES256 msDS-SupportedEncryptionTypesreference table added to README with hex/decimal values and source link- Dead AskDS blog link replaced with live Decrypting Kerberos Encryption Types reference
- Version history moved to CHANGELOG.md to reduce README size
- AzureADKerberos detection:
AzureADKerberos(Entra Kerberos proxy) object in DC OU is now automatically detected and excluded from all DC encryption counts - Separate informational display for AzureADKerberos in summary tables and CSV/JSON exports
- Compare-Assessments.ps1: shows AzureADKerberos presence note in DC comparison
- New Pester tests for AzureADKerberos filtering (with real DCs, alone, absent)
- CVE-2026-20833 support: KDCSVC System event scanning (events 201-209)
RC4DefaultDisablementPhasevalue 2 (Enforcement mode) recognition- Phased recommendation workflow: value 1 (Audit) → monitor KDCSVC events → value 2 (Enforce)
- April 2026 Enforcement phase added to timeline
- Explicit RC4 exception value
0x1C(decimal 28 = RC4 + AES128 + AES256) for per-account exceptions - Domain-wide
DefaultDomainSupportedEncTypesfallback warning (leaves accounts vulnerable to CVE-2026-20833) - Compare-Assessments.ps1: KDCSVC event comparison across assessments
- CVE-2026-20833 KB5073381 reference documentation added
- 173 Pester unit tests (12 new for KDCSVC events and Enforcement mode)
- KDC registry assessment (
DefaultDomainSupportedEncTypes,RC4DefaultDisablementPhase) - Kerberos audit policy pre-check before event log analysis
- Missing AES keys detection (accounts with passwords predating DFL 2008)
- Inline remediation commands shown with every finding (no switch needed)
- July 2026 RC4 removal timeline and January 2026 update guidance
- Explicit RC4 exception workflow for user and computer accounts
klist purgein all remediation steps- Compare-Assessments.ps1: account changes, registry keys, missing AES keys
- Microsoft Kerberos-Crypto tools references
- KRBTGT password age and encryption type assessment
- USE_DES_KEY_ONLY flag detection
- Service account (SPN) RC4/DES-only encryption detection
- gMSA/sMSA encryption review
- Stale password service account detection (>365 days with RC4)
- WinRM-first event log queries with RPC fallback
- Full forest DC enumeration per domain
- Child domain support fixes
- Comprehensive summary tables
- Complete rewrite with post-November 2022 logic
- Fast execution (< 5 minutes vs 5+ hours in v1.0)
- Event-based actual usage detection