dissect.database 1.2.dev8__tar.gz → 1.2.dev10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/PKG-INFO +1 -1
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/database.py +6 -6
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/ntds.py +17 -3
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/attributeschema.py +28 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/c_dnsnode.py +109 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/c_dnsnode.pyi +146 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/certificationauthority.py +5 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/computer.py +15 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/configuration.py +5 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/crossref.py +27 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/crossrefcontainer.py +5 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/dnsnode.py +443 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/domaindns.py +5 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/group.py +10 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/grouppolicycontainer.py +5 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ntdsdsa.py +5 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/object.py +36 -10
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/organizationalperson.py +33 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/organizationalunit.py +51 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/person.py +23 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/pkienrollmentservice.py +5 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/server.py +5 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/site.py +16 -1
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/top.py +5 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/trusteddomain.py +49 -0
- dissect_database-1.2.dev10/dissect/database/ese/ntds/objects/user.py +141 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/schema.py +3 -3
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/util.py +106 -33
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect.database.egg-info/PKG-INFO +1 -1
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect.database.egg-info/SOURCES.txt +4 -0
- dissect_database-1.2.dev10/tests/ese/ntds/objects/test_dnsnode.py +260 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/test_ntds.py +96 -1
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/test_pek.py +2 -2
- dissect_database-1.2.dev10/tests/sqlite3/__init__.py +0 -0
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/attributeschema.py +0 -13
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/crossref.py +0 -13
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/dnsnode.py +0 -13
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/organizationalperson.py +0 -18
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/organizationalunit.py +0 -26
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/person.py +0 -13
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/trusteddomain.py +0 -13
- dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/user.py +0 -74
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/.git-blame-ignore-revs +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/COPYRIGHT +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/LICENSE +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/MANIFEST.in +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/README.md +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/c_db.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/c_db.pyi +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/db.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/tools/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/tools/c_rpm.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/tools/c_rpm.pyi +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/bsd/tools/rpm.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/c_ese.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/c_ese.pyi +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/compression.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/cursor.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ese.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/exception.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/index.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/lcmapstring.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/c_ds.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/c_ds.pyi +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/c_pek.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/c_pek.pyi +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/c_sd.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/c_sd.pyi +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/applicationsettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/builtindomain.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/classschema.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/classstore.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/container.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/controlaccessright.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/crldistributionpoint.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/dfsconfiguration.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/displayspecifier.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/dmd.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/dnszone.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/domain.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/domainpolicy.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/dsuisettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/filelinktracking.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/foreignsecurityprincipal.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/infrastructureupdate.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/intersitetransport.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/intersitetransportcontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ipsecbase.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ipsecfilter.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ipsecisakmppolicy.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ipsecnegotiationpolicy.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ipsecnfa.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ipsecpolicy.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/leaf.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/linktrackobjectmovetable.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/linktrackvolumetable.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/locality.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/lostandfound.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msauthz_centralaccesspolicies.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msauthz_centralaccessrules.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_content.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_contentset.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_globalsettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_localsettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_member.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_replicationgroup.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_subscriber.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_subscription.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdfsr_topology.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msdns_serversettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_authnpolicies.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_authnpolicysilos.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_claimstransformationpolicies.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_claimtype.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_claimtypepropertybase.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_claimtypes.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_optionalfeature.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_passwordsettingscontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_quotacontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_resourceproperties.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_resourceproperty.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_resourcepropertylist.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_shadowprincipalcontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msds_valuetype.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msfve_recoveryinformation.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msimaging_psps.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/mskds_provserverconfiguration.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msmqenterprisesettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/mspki_enterpriseoid.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/mspki_privatekeyrecoveryagent.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/msspp_activationobjectscontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/mstpm_informationobjectscontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ntdsconnection.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ntdsservice.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ntdssitesettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ntfrssettings.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/physicallocation.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/pkicertificatetemplate.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/querypolicy.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ridmanager.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/ridset.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/rpccontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/rrasadministrationdictionary.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/samserver.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/secret.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/securityobject.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/serverscontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/sitelink.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/sitescontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/subnetcontainer.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/objects/subschema.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/pek.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/query.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/sd.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/tools/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/tools/ntds.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/page.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/record.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/sorting_table.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/table.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/tools/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/tools/certlog.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/tools/impacket.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/tools/sru.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/tools/ual.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/util.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/exception.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/c_sqlite3.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/c_sqlite3.pyi +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/encryption/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/encryption/sqlcipher/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/encryption/sqlcipher/exception.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/encryption/sqlcipher/sqlcipher.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/exception.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/sqlite3.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/util.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/sqlite3/wal.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect.database.egg-info/dependency_links.txt +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect.database.egg-info/entry_points.txt +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect.database.egg-info/requires.txt +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect.database.egg-info/top_level.txt +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/pyproject.toml +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/setup.cfg +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/_docs/Makefile +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/_docs/conf.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/_docs/index.rst +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/_tools/sqlite3/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/_tools/sqlite3/generate_sqlite.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/_util.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/bsd/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/bsd/conftest.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/bsd/test_db.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/bsd/test_rpm.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/conftest.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/conftest.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/conftest.py +0 -0
- {dissect_database-1.2.dev8/tests/ese/tools → dissect_database-1.2.dev10/tests/ese/ntds/objects}/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/test_benchmark.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/test_query.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/test_schema.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/test_sd.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/ntds/test_util.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/test_cursor.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/test_ese.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/test_index.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/test_page.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/test_record.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/test_table.py +0 -0
- {dissect_database-1.2.dev8/tests/sqlite3 → dissect_database-1.2.dev10/tests/ese/tools}/__init__.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/tools/test_certlog.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/tools/test_sru.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/ese/tools/test_ual.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/sqlite3/conftest.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/sqlite3/test_default_values.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/sqlite3/test_row.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/sqlite3/test_sqlcipher.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/sqlite3/test_sqlite3.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/sqlite3/test_util.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tests/sqlite3/test_wal.py +0 -0
- {dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dissect.database
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.dev10
|
|
4
4
|
Summary: A Dissect module implementing parsers for various database formats, including Berkeley DB, Microsofts Extensible Storage Engine (ESE) and SQLite3
|
|
5
5
|
Author-email: Dissect Team <dissect@fox-it.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
{dissect_database-1.2.dev8 → dissect_database-1.2.dev10}/dissect/database/ese/ntds/database.py
RENAMED
|
@@ -11,7 +11,7 @@ from dissect.database.ese.ntds.pek import PEK
|
|
|
11
11
|
from dissect.database.ese.ntds.query import Query
|
|
12
12
|
from dissect.database.ese.ntds.schema import Schema
|
|
13
13
|
from dissect.database.ese.ntds.sd import SecurityDescriptor
|
|
14
|
-
from dissect.database.ese.ntds.util import DN,
|
|
14
|
+
from dissect.database.ese.ntds.util import DN, DatabaseFlag, SearchFlag, encode_value
|
|
15
15
|
|
|
16
16
|
if TYPE_CHECKING:
|
|
17
17
|
from collections.abc import Iterator
|
|
@@ -44,14 +44,14 @@ class Database:
|
|
|
44
44
|
self.data._make_dn.cache_clear()
|
|
45
45
|
|
|
46
46
|
@cached_property
|
|
47
|
-
def flags(self) ->
|
|
47
|
+
def flags(self) -> DatabaseFlag | None:
|
|
48
48
|
"""Return the database flags."""
|
|
49
49
|
if self.hiddeninfo is None:
|
|
50
50
|
return None
|
|
51
51
|
|
|
52
|
-
result =
|
|
52
|
+
result = DatabaseFlag(0)
|
|
53
53
|
flags = self.hiddeninfo.get("flags_col")
|
|
54
|
-
for idx, member in enumerate(
|
|
54
|
+
for idx, member in enumerate(DatabaseFlag.__members__.values()):
|
|
55
55
|
if flags[idx] == ord(b"1"):
|
|
56
56
|
result = member if result is None else result | member
|
|
57
57
|
|
|
@@ -256,9 +256,9 @@ class DataTable:
|
|
|
256
256
|
if schema.search_flags is None:
|
|
257
257
|
raise ValueError(f"Attribute is not indexed: {attribute!r}")
|
|
258
258
|
|
|
259
|
-
if
|
|
259
|
+
if SearchFlag.Indexed in schema.search_flags:
|
|
260
260
|
name = f"INDEX_{schema.id:08x}"
|
|
261
|
-
elif
|
|
261
|
+
elif SearchFlag.TupleIndexed in schema.search_flags:
|
|
262
262
|
name = f"INDEX_T_{schema.id:08x}"
|
|
263
263
|
else:
|
|
264
264
|
# TODO add ContainerIndexed
|
|
@@ -11,6 +11,7 @@ if TYPE_CHECKING:
|
|
|
11
11
|
|
|
12
12
|
from dissect.database.ese.ntds.objects import (
|
|
13
13
|
Computer,
|
|
14
|
+
DnsNode,
|
|
14
15
|
DomainDNS,
|
|
15
16
|
Group,
|
|
16
17
|
GroupPolicyContainer,
|
|
@@ -20,6 +21,7 @@ if TYPE_CHECKING:
|
|
|
20
21
|
TrustedDomain,
|
|
21
22
|
User,
|
|
22
23
|
)
|
|
24
|
+
from dissect.database.ese.ntds.objects.organizationalunit import OrganizationalUnit
|
|
23
25
|
from dissect.database.ese.ntds.pek import PEK
|
|
24
26
|
|
|
25
27
|
|
|
@@ -83,11 +85,11 @@ class NTDS:
|
|
|
83
85
|
|
|
84
86
|
def groups(self) -> Iterator[Group]:
|
|
85
87
|
"""Get all group objects from the database."""
|
|
86
|
-
yield from self.search(
|
|
88
|
+
yield from self.search(objectClass="group")
|
|
87
89
|
|
|
88
90
|
def servers(self) -> Iterator[Server]:
|
|
89
91
|
"""Get all server objects from the database."""
|
|
90
|
-
yield from self.search(
|
|
92
|
+
yield from self.search(objectClass="server")
|
|
91
93
|
|
|
92
94
|
def users(self) -> Iterator[User]:
|
|
93
95
|
"""Get all user objects from the database."""
|
|
@@ -95,7 +97,11 @@ class NTDS:
|
|
|
95
97
|
|
|
96
98
|
def computers(self) -> Iterator[Computer]:
|
|
97
99
|
"""Get all computer objects from the database."""
|
|
98
|
-
yield from self.search(
|
|
100
|
+
yield from self.search(objectClass="computer")
|
|
101
|
+
|
|
102
|
+
def domains(self) -> Iterator[DomainDNS]:
|
|
103
|
+
"""Get all domain objects from the database."""
|
|
104
|
+
yield from self.search(objectClass="domainDNS")
|
|
99
105
|
|
|
100
106
|
def trusts(self) -> Iterator[TrustedDomain]:
|
|
101
107
|
"""Get all trust objects from the database."""
|
|
@@ -105,10 +111,18 @@ class NTDS:
|
|
|
105
111
|
"""Get all group policy objects (GPO) objects from the database."""
|
|
106
112
|
yield from self.search(objectClass="groupPolicyContainer")
|
|
107
113
|
|
|
114
|
+
def organizational_units(self) -> Iterator[OrganizationalUnit]:
|
|
115
|
+
"""Get all organizational unit (OU) objects from the database."""
|
|
116
|
+
yield from self.search(objectClass="organizationalUnit")
|
|
117
|
+
|
|
108
118
|
def secrets(self) -> Iterator[Secret]:
|
|
109
119
|
"""Get all secret objects from the database."""
|
|
110
120
|
yield from self.search(objectClass="secret")
|
|
111
121
|
|
|
122
|
+
def dns_nodes(self) -> Iterator[DnsNode]:
|
|
123
|
+
"""Get all DnsNode objects from the database."""
|
|
124
|
+
yield from self.search(objectClass="dnsNode")
|
|
125
|
+
|
|
112
126
|
def backup_keys(self) -> Iterator[BackupKey]:
|
|
113
127
|
"""Get all DPAPI backup keys from the database."""
|
|
114
128
|
if not self.pek.unlocked:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from dissect.database.ese.ntds.objects.top import Top
|
|
6
|
+
from dissect.database.ese.ntds.util import SearchFlag, SystemFlagAttribute
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from dissect.database.ese.ntds.objects.object import DecoderMap
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AttributeSchema(Top):
|
|
13
|
+
"""Represents an attribute schema object in the Active Directory.
|
|
14
|
+
|
|
15
|
+
References:
|
|
16
|
+
- https://learn.microsoft.com/en-us/windows/win32/adschema/c-attributeschema
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
__object_class__ = "attributeSchema"
|
|
20
|
+
__decoders__: ClassVar[DecoderMap] = {
|
|
21
|
+
"searchFlags": lambda db, value: SearchFlag(value),
|
|
22
|
+
"systemFlags": lambda db, value: SystemFlagAttribute(value),
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def search_flags(self) -> SearchFlag | None:
|
|
27
|
+
"""Return the searchFlags of this attribute schema."""
|
|
28
|
+
return self.get("searchFlags")
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dissect.cstruct import cstruct
|
|
4
|
+
|
|
5
|
+
dns_record_def = """
|
|
6
|
+
|
|
7
|
+
// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/39b03b89-2264-4063-8198-d62f62a6441a
|
|
8
|
+
enum DNS_RECORD_TYPE : WORD {
|
|
9
|
+
ZERO = 0x0000, // An empty record type ([RFC1034] section 3.6 and [RFC1035] section 3.2.2).
|
|
10
|
+
A = 0x0001, // An A record type, used for storing an IP address ([RFC1035] section 3.2.2).
|
|
11
|
+
NS = 0x0002, // An authoritative name-server
|
|
12
|
+
// record type ([RFC1034] section 3.6 and [RFC1035] section 3.2.2).
|
|
13
|
+
MD = 0x0003, // A mail-destination record type ([RFC1035] section 3.2.2).
|
|
14
|
+
MF = 0x0004, // A mail forwarder record type ([RFC1035] section 3.2.2).
|
|
15
|
+
CNAME = 0x0005, // A record type that contains the canonical name of a DNS alias ([RFC1035] section 3.2.2).
|
|
16
|
+
SOA = 0x0006, // A Start of Authority (SOA) record type ([RFC1035] section 3.2.2).
|
|
17
|
+
MB = 0x0007, // A mailbox record type ([RFC1035] section 3.2.2).
|
|
18
|
+
MG = 0x0008, // A mail group member record type ([RFC1035] section 3.2.2).
|
|
19
|
+
MR = 0x0009, // A mail-rename record type ([RFC1035] section 3.2.2).
|
|
20
|
+
NULL = 0x000A, // A record type for completion queries ([RFC1035] section 3.2.2).
|
|
21
|
+
WKS = 0x000B, // A record type for a well-known service ([RFC1035] section 3.2.2).
|
|
22
|
+
PTR = 0x000C, // A record type containing FQDN pointer ([RFC1035] section 3.2.2).
|
|
23
|
+
HINFO = 0x000D, // A host information record type ([RFC1035] section 3.2.2).
|
|
24
|
+
MINFO = 0x000E, // A mailbox or mailing list information record type ([RFC1035] section 3.2.2).
|
|
25
|
+
MX = 0x000F, // A mail-exchanger record type ([RFC1035] section 3.2.2).
|
|
26
|
+
TXT = 0x0010, // A record type containing a text string ([RFC1035] section 3.2.2).
|
|
27
|
+
RP = 0x0011, // A responsible-person record type [RFC1183].
|
|
28
|
+
AFSDB = 0x0012, // A record type containing AFS database location [RFC1183].
|
|
29
|
+
X25 = 0x0013, // An X25 PSDN address record type [RFC1183].
|
|
30
|
+
ISDN = 0x0014, // An ISDN address record type [RFC1183].
|
|
31
|
+
RT = 0x0015, // A route through record type [RFC1183].
|
|
32
|
+
SIG = 0x0018, // A cryptographic public key signature record type [RFC2931].
|
|
33
|
+
KEY = 0x0019, // A record type containing public key used in DNSSEC [RFC2535].
|
|
34
|
+
AAAA = 0x001C, // An IPv6 address record type [RFC3596].
|
|
35
|
+
LOC = 0x001D, // A location information record type [RFC1876].
|
|
36
|
+
NXT = 0x001E, // A next-domain record type [RFC2065].
|
|
37
|
+
SRV = 0x0021, // A server selection record type [RFC2782].
|
|
38
|
+
ATMA = 0x0022, // An Asynchronous Transfer Mode (ATM) address record type [ATMA].
|
|
39
|
+
NAPTR = 0x0023, // An NAPTR record type [RFC2915].
|
|
40
|
+
DNAME = 0x0027, // A DNAME record type [RFC2672].
|
|
41
|
+
DS = 0x002B, // A DS record type [RFC4034].
|
|
42
|
+
RRSIG = 0x002E, // An RRSIG record type [RFC4034].
|
|
43
|
+
NSEC = 0x002F, // An NSEC record type [RFC4034].
|
|
44
|
+
DNSKEY = 0x0030, // A DNSKEY record type [RFC4034].
|
|
45
|
+
DHCID = 0x0031, // A DHCID record type [RFC4701].
|
|
46
|
+
NSEC3 = 0x0032, // An NSEC3 record type [RFC5155].
|
|
47
|
+
NSEC3PARAM = 0x0033, // An NSEC3PARAM record type [RFC5155].
|
|
48
|
+
TLSA = 0x0034, // A TLSA record type [RFC6698].
|
|
49
|
+
ALL = 0x00FF, // A query-only type requesting all records [RFC1035].
|
|
50
|
+
WINS = 0xFF01, // A record type containing Windows Internet Name Service (WINS)
|
|
51
|
+
// forward lookup data [MS-WINSRADNS_TYPE_WINSR].
|
|
52
|
+
WINSR = 0xFF02 // A record type containing WINS reverse lookup data [MS-WINSRA].
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/6912b338-5472-4f59-b912-0edb536b6ed8
|
|
56
|
+
typedef struct DNS_RECORD_HEADER {
|
|
57
|
+
WORD DataLength;
|
|
58
|
+
DNS_RECORD_TYPE Type;
|
|
59
|
+
BYTE Version; // Must be 0x05
|
|
60
|
+
BYTE Rank;
|
|
61
|
+
WORD Flags; // Must be 0x00
|
|
62
|
+
DWORD Serial;
|
|
63
|
+
DWORD TtlSeconds; // Big Endian
|
|
64
|
+
DWORD Reserved; // MUST be 0x00000000.
|
|
65
|
+
DWORD TimeStamp;
|
|
66
|
+
CHAR Data[DataLength];
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/3fd41adc-c69e-407b-979e-721251403132
|
|
70
|
+
// MS docs indicate that structure is 4 byte aligned, and that the string MUST NOT be null-terminated.
|
|
71
|
+
// But observed reality is a null terminated string (null char not counted in NameLength)
|
|
72
|
+
typedef struct DNS_RPC_NAME{
|
|
73
|
+
BYTE NameLength;
|
|
74
|
+
CHAR dnsName[NameLength];
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/db37cab7-f121-43ba-81c5-ca0e198d4b9a
|
|
78
|
+
typedef struct DNS_RPC_RECORD_SRV {
|
|
79
|
+
WORD Priority;
|
|
80
|
+
WORD Weight;
|
|
81
|
+
WORD Port;
|
|
82
|
+
DNS_RPC_NAME nameTarget;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/f647d391-6614-4c3e-b38b-4df971590eb6
|
|
86
|
+
typedef struct DNS_RPC_RECORD_NAME_PREFERENCE {
|
|
87
|
+
WORD Preference;
|
|
88
|
+
DNS_RPC_NAME nameExchange;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/dcd3ec16-d6bf-4bb4-9128-6172f9e5f066
|
|
92
|
+
typedef struct DNS_RPC_RECORD_SOA {
|
|
93
|
+
DWORD Serial;
|
|
94
|
+
DWORD Refresh;
|
|
95
|
+
DWORD Retry;
|
|
96
|
+
DWORD Expire;
|
|
97
|
+
DWORD MinimumTtl;
|
|
98
|
+
DNS_RPC_NAME namePrimaryServer;
|
|
99
|
+
BYTE _pad;
|
|
100
|
+
DNS_RPC_NAME ZoneAdministratorEmail;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
// https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dnsp/def7736a-dd09-4b4a-b8d6-6a702a7ecde0
|
|
104
|
+
typedef struct DNS_RPC_RECORD_TS {
|
|
105
|
+
QWORD EntombedTime;
|
|
106
|
+
};
|
|
107
|
+
"""
|
|
108
|
+
c_dns_record = cstruct(dns_record_def)
|
|
109
|
+
DNS_RECORD_TYPE = c_dns_record.DNS_RECORD_TYPE
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Generated by cstruct-stubgen
|
|
2
|
+
from typing import BinaryIO, Literal, TypeAlias, overload
|
|
3
|
+
|
|
4
|
+
import dissect.cstruct as __cs__
|
|
5
|
+
|
|
6
|
+
class _c_dns_record(__cs__.cstruct):
|
|
7
|
+
class DNS_RECORD_TYPE(__cs__.Enum):
|
|
8
|
+
ZERO = ...
|
|
9
|
+
A = ...
|
|
10
|
+
NS = ...
|
|
11
|
+
MD = ...
|
|
12
|
+
MF = ...
|
|
13
|
+
CNAME = ...
|
|
14
|
+
SOA = ...
|
|
15
|
+
MB = ...
|
|
16
|
+
MG = ...
|
|
17
|
+
MR = ...
|
|
18
|
+
NULL = ...
|
|
19
|
+
WKS = ...
|
|
20
|
+
PTR = ...
|
|
21
|
+
HINFO = ...
|
|
22
|
+
MINFO = ...
|
|
23
|
+
MX = ...
|
|
24
|
+
TXT = ...
|
|
25
|
+
RP = ...
|
|
26
|
+
AFSDB = ...
|
|
27
|
+
X25 = ...
|
|
28
|
+
ISDN = ...
|
|
29
|
+
RT = ...
|
|
30
|
+
SIG = ...
|
|
31
|
+
KEY = ...
|
|
32
|
+
AAAA = ...
|
|
33
|
+
LOC = ...
|
|
34
|
+
NXT = ...
|
|
35
|
+
SRV = ...
|
|
36
|
+
ATMA = ...
|
|
37
|
+
NAPTR = ...
|
|
38
|
+
DNAME = ...
|
|
39
|
+
DS = ...
|
|
40
|
+
RRSIG = ...
|
|
41
|
+
NSEC = ...
|
|
42
|
+
DNSKEY = ...
|
|
43
|
+
DHCID = ...
|
|
44
|
+
NSEC3 = ...
|
|
45
|
+
NSEC3PARAM = ...
|
|
46
|
+
TLSA = ...
|
|
47
|
+
ALL = ...
|
|
48
|
+
WINS = ...
|
|
49
|
+
WINSR = ...
|
|
50
|
+
|
|
51
|
+
class DNS_RECORD_HEADER(__cs__.Structure):
|
|
52
|
+
DataLength: _c_dns_record.uint16
|
|
53
|
+
Type: _c_dns_record.DNS_RECORD_TYPE
|
|
54
|
+
Version: _c_dns_record.uint8
|
|
55
|
+
Rank: _c_dns_record.uint8
|
|
56
|
+
Flags: _c_dns_record.uint16
|
|
57
|
+
Serial: _c_dns_record.uint32
|
|
58
|
+
TtlSeconds: _c_dns_record.uint32
|
|
59
|
+
Reserved: _c_dns_record.uint32
|
|
60
|
+
TimeStamp: _c_dns_record.uint32
|
|
61
|
+
Data: __cs__.CharArray
|
|
62
|
+
@overload
|
|
63
|
+
def __init__(
|
|
64
|
+
self,
|
|
65
|
+
DataLength: _c_dns_record.uint16 | None = ...,
|
|
66
|
+
Type: _c_dns_record.DNS_RECORD_TYPE | None = ...,
|
|
67
|
+
Version: _c_dns_record.uint8 | None = ...,
|
|
68
|
+
Rank: _c_dns_record.uint8 | None = ...,
|
|
69
|
+
Flags: _c_dns_record.uint16 | None = ...,
|
|
70
|
+
Serial: _c_dns_record.uint32 | None = ...,
|
|
71
|
+
TtlSeconds: _c_dns_record.uint32 | None = ...,
|
|
72
|
+
Reserved: _c_dns_record.uint32 | None = ...,
|
|
73
|
+
TimeStamp: _c_dns_record.uint32 | None = ...,
|
|
74
|
+
Data: __cs__.CharArray | None = ...,
|
|
75
|
+
): ...
|
|
76
|
+
@overload
|
|
77
|
+
def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ...
|
|
78
|
+
|
|
79
|
+
class DNS_RPC_NAME(__cs__.Structure):
|
|
80
|
+
NameLength: _c_dns_record.uint8
|
|
81
|
+
dnsName: __cs__.CharArray
|
|
82
|
+
@overload
|
|
83
|
+
def __init__(self, NameLength: _c_dns_record.uint8 | None = ..., dnsName: __cs__.CharArray | None = ...): ...
|
|
84
|
+
@overload
|
|
85
|
+
def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ...
|
|
86
|
+
|
|
87
|
+
class DNS_RPC_RECORD_SRV(__cs__.Structure):
|
|
88
|
+
Priority: _c_dns_record.uint16
|
|
89
|
+
Weight: _c_dns_record.uint16
|
|
90
|
+
Port: _c_dns_record.uint16
|
|
91
|
+
nameTarget: _c_dns_record.DNS_RPC_NAME
|
|
92
|
+
@overload
|
|
93
|
+
def __init__(
|
|
94
|
+
self,
|
|
95
|
+
Priority: _c_dns_record.uint16 | None = ...,
|
|
96
|
+
Weight: _c_dns_record.uint16 | None = ...,
|
|
97
|
+
Port: _c_dns_record.uint16 | None = ...,
|
|
98
|
+
nameTarget: _c_dns_record.DNS_RPC_NAME | None = ...,
|
|
99
|
+
): ...
|
|
100
|
+
@overload
|
|
101
|
+
def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ...
|
|
102
|
+
|
|
103
|
+
class DNS_RPC_RECORD_NAME_PREFERENCE(__cs__.Structure):
|
|
104
|
+
Preference: _c_dns_record.uint16
|
|
105
|
+
nameExchange: _c_dns_record.DNS_RPC_NAME
|
|
106
|
+
@overload
|
|
107
|
+
def __init__(
|
|
108
|
+
self, Preference: _c_dns_record.uint16 | None = ..., nameExchange: _c_dns_record.DNS_RPC_NAME | None = ...
|
|
109
|
+
): ...
|
|
110
|
+
@overload
|
|
111
|
+
def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ...
|
|
112
|
+
|
|
113
|
+
class DNS_RPC_RECORD_SOA(__cs__.Structure):
|
|
114
|
+
Serial: _c_dns_record.uint32
|
|
115
|
+
Refresh: _c_dns_record.uint32
|
|
116
|
+
Retry: _c_dns_record.uint32
|
|
117
|
+
Expire: _c_dns_record.uint32
|
|
118
|
+
MinimumTtl: _c_dns_record.uint32
|
|
119
|
+
namePrimaryServer: _c_dns_record.DNS_RPC_NAME
|
|
120
|
+
_pad: _c_dns_record.uint8
|
|
121
|
+
ZoneAdministratorEmail: _c_dns_record.DNS_RPC_NAME
|
|
122
|
+
@overload
|
|
123
|
+
def __init__(
|
|
124
|
+
self,
|
|
125
|
+
Serial: _c_dns_record.uint32 | None = ...,
|
|
126
|
+
Refresh: _c_dns_record.uint32 | None = ...,
|
|
127
|
+
Retry: _c_dns_record.uint32 | None = ...,
|
|
128
|
+
Expire: _c_dns_record.uint32 | None = ...,
|
|
129
|
+
MinimumTtl: _c_dns_record.uint32 | None = ...,
|
|
130
|
+
namePrimaryServer: _c_dns_record.DNS_RPC_NAME | None = ...,
|
|
131
|
+
_pad: _c_dns_record.uint8 | None = ...,
|
|
132
|
+
ZoneAdministratorEmail: _c_dns_record.DNS_RPC_NAME | None = ...,
|
|
133
|
+
): ...
|
|
134
|
+
@overload
|
|
135
|
+
def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ...
|
|
136
|
+
|
|
137
|
+
class DNS_RPC_RECORD_TS(__cs__.Structure):
|
|
138
|
+
EntombedTime: _c_dns_record.uint64
|
|
139
|
+
@overload
|
|
140
|
+
def __init__(self, EntombedTime: _c_dns_record.uint64 | None = ...): ...
|
|
141
|
+
@overload
|
|
142
|
+
def __init__(self, fh: bytes | memoryview | bytearray | BinaryIO, /): ...
|
|
143
|
+
|
|
144
|
+
# Technically `c_dns_record` is an instance of `_c_dns_record`, but then we can't use it in type hints
|
|
145
|
+
c_dns_record: TypeAlias = _c_dns_record
|
|
146
|
+
DNS_RECORD_TYPE: TypeAlias = _c_dns_record.DNS_RECORD_TYPE
|
|
@@ -23,6 +23,21 @@ class Computer(User):
|
|
|
23
23
|
def __repr_body__(self) -> str:
|
|
24
24
|
return f"name={self.name!r}"
|
|
25
25
|
|
|
26
|
+
@property
|
|
27
|
+
def dns_host_name(self) -> str | None:
|
|
28
|
+
"""Return the dNSHostName of this computer."""
|
|
29
|
+
return self.get("dNSHostName")
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def operating_system(self) -> str | None:
|
|
33
|
+
"""Return the operatingSystem of this computer."""
|
|
34
|
+
return self.get("operatingSystem")
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def operating_system_version(self) -> str | None:
|
|
38
|
+
"""Return the operatingSystemVersion of this computer."""
|
|
39
|
+
return self.get("operatingSystemVersion")
|
|
40
|
+
|
|
26
41
|
def fve_recovery_information(self) -> Iterator[MSFVERecoveryInformation]:
|
|
27
42
|
"""Return the BitLocker recovery information objects associated with this computer."""
|
|
28
43
|
for child in self.children():
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from dissect.database.ese.ntds.objects.top import Top
|
|
6
|
+
from dissect.database.ese.ntds.util import SystemFlagCrossRef
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from dissect.database.ese.ntds.objects.object import DecoderMap
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CrossRef(Top):
|
|
13
|
+
"""Represents a cross-reference object in the Active Directory.
|
|
14
|
+
|
|
15
|
+
References:
|
|
16
|
+
- https://learn.microsoft.com/en-us/windows/win32/adschema/c-crossref
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
__object_class__ = "crossRef"
|
|
20
|
+
__decoders__: ClassVar[DecoderMap] = {
|
|
21
|
+
"systemFlags": lambda db, value: SystemFlagCrossRef(value),
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@property
|
|
25
|
+
def behavior_version(self) -> int | None:
|
|
26
|
+
"""Return the msDS-Behavior-Version of this cross-reference."""
|
|
27
|
+
return self.get("msDS-Behavior-Version")
|
|
@@ -11,3 +11,8 @@ class CrossRefContainer(Top):
|
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
__object_class__ = "crossRefContainer"
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def behavior_version(self) -> int | None:
|
|
17
|
+
"""Return the msDS-Behavior-Version of this cross-reference container."""
|
|
18
|
+
return self.get("msDS-Behavior-Version")
|