Skip to content

v0.3.0 "Heavy Load"

Latest

Choose a tag to compare

@github-actions github-actions released this 14 Aug 06:02

First MCP server package release since v0.2.5. This cycle touched both
the collector (already released separately as v1.7.0) and the server
package itself — Live Mode (live.py), the boolean/UAC normalization
fixes in tools/users.py, tools/computers.py, and tools/fsp.py
(_normalize.py), and the new Live Mode warning channel (_clixml.py)
— see "MCP Server" below.

Collector

  • Collector bumped to v1.7.0.
  • Removed the silent -Limit caps on Users/Computers collection (previously
    5,000/10,000); collection is now unlimited by default, with -Limit
    available only for opt-in test/debug use.
  • Enabled, PasswordNeverExpires, TrustedForDelegation, and
    TrustedToAuthForDelegation now report explicit null — instead of a
    fabricated value — when userAccountControl cannot be read for a user
    (typically caused by a non-elevated collector session; task #131).
  • Added a non-blocking elevation check: the collector now warns when run
    from a non-elevated PowerShell session, since some AD environments
    return a null userAccountControl without one (task #137).
  • Fixed forest/domain name resolution to anchor to the target server
    (-Server) instead of the calling machine's own identity — previously
    produced wrong output filenames and an incorrect forest/fsmo_roles
    section in cross-forest and trust scenarios (task #132).
  • New Membership.psm1: group membership is now resolved member-by-member
    instead of failing an entire group on a single broken reference.
    Unresolvable members are recorded as placeholder rows instead of
    disappearing in group_members and privileged_groups (different field
    casing between the two). groups stays accurate too, by counting raw
    member DNs directly. privileged_accounts is the one exception:
    unresolvable members are excluded from it on purpose, to keep its count
    accurate -- they remain visible in privileged_groups/group_members
    (task #134).
  • New Logging.psm1: shared fallback logging so warnings from collector
    modules are never silently lost regardless of invocation style.
  • Schema.psm1: schema extensions collection is now capped via a -Limit
    parameter (default 500, 0 = unlimited) instead of a fixed cap with
    no override; a warning is logged through Write-SafeCollectorLog when
    the cap actually truncates the result. The schema section in Live
    Mode applies the identical 500 cap, with no -Limit override on that
    side — use the offline collector with -Limit 0 for a complete
    collection in an environment that exceeds it (task #130).
  • Fixed an ADWS enumeration timeout on large group/DC counts by
    materializing collections before iterating.
  • installer/Manage-Workspaces.ps1: fixed array-collapse bugs causing
    incorrect behavior with a single forest and a crash with zero forests
    configured (-RepairMetadata, -Validate -Name).

MCP Server

  • PasswordNotRequired now reports explicit null — instead of a
    fabricated false — when userAccountControl cannot be read for a
    user, matching the other 4 UAC-derived fields already fixed in task
    #131. Fixed identically in the collector and in Live Mode (task #135).
  • get_user_summary: disabled no longer counts accounts with unreadable
    userAccountControl as disabled. New uac_unreadable_count field
    reports that population explicitly, so enabled + disabled + uac_unreadable_count == total always holds (task #136).
  • get_users: the enabled and password_never_expires filters no
    longer misclassify accounts with unreadable userAccountControl into
    the false branch; new password_not_required filter added for
    symmetry; new uac_unreadable filter to query that population
    explicitly, combinable with every non-UAC filter (task #136).
  • Live Mode: warnings and non-fatal errors from PowerShell were being
    silently discarded on every successful call — stderr was only
    inspected after a failure, so a non-blocking warning (e.g. unreadable
    userAccountControl, the new Schema cap, unresolved group members)
    never reached the caller or the EventLog. stderr is now always read,
    parsed with a new shared CLIXML parser (_clixml.py). Every warning is
    logged to the EventLog unconditionally; most tools additionally surface
    it in their JSON response via an optional warnings field, present
    only when that specific call actually degraded — see
    docs/tools-reference.md for the exact list of tools this applies to.
    Failure-path error messages shown to the caller are now extracted with
    the same parser instead of a raw CLIXML blob (task #141).