| use crate::string::UTF8Const; |
| use winapi::shared::basetsd::ULONG64; |
| use winapi::shared::minwindef::DWORD; |
| use winapi::shared::ntdef::{ |
| BOOLEAN, HANDLE, LARGE_INTEGER, NTSTATUS, OEM_STRING, PLARGE_INTEGER, POBJECT_ATTRIBUTES, |
| PUCHAR, PULONG, PUNICODE_STRING, PVOID, PWSTR, ULONG, UNICODE_STRING, USHORT, |
| }; |
| use winapi::um::ntsecapi::PDOMAIN_PASSWORD_INFORMATION; |
| use winapi::um::subauth::LOGON_HOURS; |
| use winapi::um::winnt::{ |
| ACCESS_MASK, PSECURITY_DESCRIPTOR, PSID, PSID_NAME_USE, SECURITY_INFORMATION, SID_NAME_USE, |
| STANDARD_RIGHTS_EXECUTE, STANDARD_RIGHTS_READ, STANDARD_RIGHTS_REQUIRED, STANDARD_RIGHTS_WRITE, |
| }; |
| pub const SAM_MAXIMUM_LOOKUP_COUNT: u32 = 1000; |
| pub const SAM_MAXIMUM_LOOKUP_LENGTH: u32 = 32000; |
| pub const SAM_MAX_PASSWORD_LENGTH: u32 = 256; |
| pub const SAM_PASSWORD_ENCRYPTION_SALT_LEN: u32 = 16; |
| pub type PSAM_HANDLE = *mut PVOID; |
| pub type SAM_HANDLE = PVOID; |
| pub type SAM_ENUMERATE_HANDLE = ULONG; |
| pub type PSAM_ENUMERATE_HANDLE = *mut ULONG; |
| STRUCT!{struct SAM_RID_ENUMERATION { |
| RelativeId: ULONG, |
| Name: UNICODE_STRING, |
| }} |
| pub type PSAM_RID_ENUMERATION = *mut SAM_RID_ENUMERATION; |
| STRUCT!{struct SAM_SID_ENUMERATION { |
| Sid: PSID, |
| Name: UNICODE_STRING, |
| }} |
| pub type PSAM_SID_ENUMERATION = *mut SAM_SID_ENUMERATION; |
| STRUCT!{struct SAM_BYTE_ARRAY { |
| Size: ULONG, |
| Data: PUCHAR, |
| }} |
| pub type PSAM_BYTE_ARRAY = *mut SAM_BYTE_ARRAY; |
| STRUCT!{struct SAM_BYTE_ARRAY_32K { |
| Size: ULONG, |
| Data: PUCHAR, |
| }} |
| pub type PSAM_BYTE_ARRAY_32K = *mut SAM_BYTE_ARRAY_32K; |
| pub type PSAM_SHELL_OBJECT_PROPERTIES = *mut SAM_BYTE_ARRAY_32K; |
| pub type SAM_SHELL_OBJECT_PROPERTIES = SAM_BYTE_ARRAY_32K; |
| EXTERN!{extern "system" { |
| fn SamFreeMemory( |
| Buffer: PVOID, |
| ) -> NTSTATUS; |
| fn SamCloseHandle( |
| SamHandle: SAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamSetSecurityObject( |
| ObjectHandle: SAM_HANDLE, |
| SecurityInformation: SECURITY_INFORMATION, |
| SecurityDescriptor: PSECURITY_DESCRIPTOR, |
| ) -> NTSTATUS; |
| fn SamQuerySecurityObject( |
| ObjectHandle: SAM_HANDLE, |
| SecurityInformation: SECURITY_INFORMATION, |
| SecurityDescriptor: *mut PSECURITY_DESCRIPTOR, |
| ) -> NTSTATUS; |
| fn SamRidToSid( |
| ObjectHandle: SAM_HANDLE, |
| Rid: ULONG, |
| Sid: *mut PSID, |
| ) -> NTSTATUS; |
| }} |
| pub const SAM_SERVER_CONNECT: ACCESS_MASK = 0x0001; |
| pub const SAM_SERVER_SHUTDOWN: ACCESS_MASK = 0x0002; |
| pub const SAM_SERVER_INITIALIZE: ACCESS_MASK = 0x0004; |
| pub const SAM_SERVER_CREATE_DOMAIN: ACCESS_MASK = 0x0008; |
| pub const SAM_SERVER_ENUMERATE_DOMAINS: ACCESS_MASK = 0x0010; |
| pub const SAM_SERVER_LOOKUP_DOMAIN: ACCESS_MASK = 0x0020; |
| pub const SAM_SERVER_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | SAM_SERVER_CONNECT |
| | SAM_SERVER_INITIALIZE | SAM_SERVER_CREATE_DOMAIN | SAM_SERVER_SHUTDOWN |
| | SAM_SERVER_ENUMERATE_DOMAINS | SAM_SERVER_LOOKUP_DOMAIN; |
| pub const SAM_SERVER_READ: ACCESS_MASK = STANDARD_RIGHTS_READ | SAM_SERVER_ENUMERATE_DOMAINS; |
| pub const SAM_SERVER_WRITE: ACCESS_MASK = |
| STANDARD_RIGHTS_WRITE | SAM_SERVER_INITIALIZE | SAM_SERVER_CREATE_DOMAIN | SAM_SERVER_SHUTDOWN; |
| pub const SAM_SERVER_EXECUTE: ACCESS_MASK = |
| STANDARD_RIGHTS_EXECUTE | SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN; |
| EXTERN!{extern "system" { |
| fn SamConnect( |
| ServerName: PUNICODE_STRING, |
| ServerHandle: PSAM_HANDLE, |
| DesiredAccess: ACCESS_MASK, |
| ObjectAttributes: POBJECT_ATTRIBUTES, |
| ) -> NTSTATUS; |
| fn SamShutdownSamServer( |
| ServerHandle: SAM_HANDLE, |
| ) -> NTSTATUS; |
| }} |
| pub const DOMAIN_READ_PASSWORD_PARAMETERS: u32 = 0x0001; |
| pub const DOMAIN_WRITE_PASSWORD_PARAMS: u32 = 0x0002; |
| pub const DOMAIN_READ_OTHER_PARAMETERS: u32 = 0x0004; |
| pub const DOMAIN_WRITE_OTHER_PARAMETERS: u32 = 0x0008; |
| pub const DOMAIN_CREATE_USER: u32 = 0x0010; |
| pub const DOMAIN_CREATE_GROUP: u32 = 0x0020; |
| pub const DOMAIN_CREATE_ALIAS: u32 = 0x0040; |
| pub const DOMAIN_GET_ALIAS_MEMBERSHIP: u32 = 0x0080; |
| pub const DOMAIN_LIST_ACCOUNTS: u32 = 0x0100; |
| pub const DOMAIN_LOOKUP: u32 = 0x0200; |
| pub const DOMAIN_ADMINISTER_SERVER: u32 = 0x0400; |
| pub const DOMAIN_ALL_ACCESS: u32 = STANDARD_RIGHTS_REQUIRED | DOMAIN_READ_OTHER_PARAMETERS |
| | DOMAIN_WRITE_OTHER_PARAMETERS | DOMAIN_WRITE_PASSWORD_PARAMS | DOMAIN_CREATE_USER |
| | DOMAIN_CREATE_GROUP | DOMAIN_CREATE_ALIAS | DOMAIN_GET_ALIAS_MEMBERSHIP |
| | DOMAIN_LIST_ACCOUNTS | DOMAIN_READ_PASSWORD_PARAMETERS | DOMAIN_LOOKUP |
| | DOMAIN_ADMINISTER_SERVER; |
| pub const DOMAIN_READ: u32 = |
| STANDARD_RIGHTS_READ | DOMAIN_GET_ALIAS_MEMBERSHIP | DOMAIN_READ_OTHER_PARAMETERS; |
| pub const DOMAIN_WRITE: u32 = STANDARD_RIGHTS_WRITE | DOMAIN_WRITE_OTHER_PARAMETERS |
| | DOMAIN_WRITE_PASSWORD_PARAMS | DOMAIN_CREATE_USER | DOMAIN_CREATE_GROUP | DOMAIN_CREATE_ALIAS |
| | DOMAIN_ADMINISTER_SERVER; |
| pub const DOMAIN_EXECUTE: u32 = STANDARD_RIGHTS_EXECUTE | DOMAIN_READ_PASSWORD_PARAMETERS |
| | DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP; |
| ENUM!{enum DOMAIN_INFORMATION_CLASS { |
| DomainPasswordInformation = 1, |
| DomainGeneralInformation = 2, |
| DomainLogoffInformation = 3, |
| DomainOemInformation = 4, |
| DomainNameInformation = 5, |
| DomainReplicationInformation = 6, |
| DomainServerRoleInformation = 7, |
| DomainModifiedInformation = 8, |
| DomainStateInformation = 9, |
| DomainUasInformation = 10, |
| DomainGeneralInformation2 = 11, |
| DomainLockoutInformation = 12, |
| DomainModifiedInformation2 = 13, |
| }} |
| ENUM!{enum DOMAIN_SERVER_ENABLE_STATE { |
| DomainServerEnabled = 1, |
| DomainServerDisabled = 2, |
| }} |
| pub type PDOMAIN_SERVER_ENABLE_STATE = *mut DOMAIN_SERVER_ENABLE_STATE; |
| ENUM!{enum DOMAIN_SERVER_ROLE { |
| DomainServerRoleBackup = 2, |
| DomainServerRolePrimary = 3, |
| }} |
| pub type PDOMAIN_SERVER_ROLE = *mut DOMAIN_SERVER_ROLE; |
| STRUCT!{#[repr(packed(4))] struct DOMAIN_GENERAL_INFORMATION { |
| ForceLogoff: LARGE_INTEGER, |
| OemInformation: UNICODE_STRING, |
| DomainName: UNICODE_STRING, |
| ReplicaSourceNodeName: UNICODE_STRING, |
| DomainModifiedCount: LARGE_INTEGER, |
| DomainServerState: DOMAIN_SERVER_ENABLE_STATE, |
| DomainServerRole: DOMAIN_SERVER_ROLE, |
| UasCompatibilityRequired: BOOLEAN, |
| UserCount: ULONG, |
| GroupCount: ULONG, |
| AliasCount: ULONG, |
| }} |
| pub type PDOMAIN_GENERAL_INFORMATION = *mut DOMAIN_GENERAL_INFORMATION; |
| STRUCT!{#[repr(packed(4))] struct DOMAIN_GENERAL_INFORMATION2 { |
| I1: DOMAIN_GENERAL_INFORMATION, |
| LockoutDuration: LARGE_INTEGER, |
| LockoutObservationWindow: LARGE_INTEGER, |
| LockoutThreshold: USHORT, |
| }} |
| pub type PDOMAIN_GENERAL_INFORMATION2 = *mut DOMAIN_GENERAL_INFORMATION2; |
| STRUCT!{struct DOMAIN_UAS_INFORMATION { |
| UasCompatibilityRequired: BOOLEAN, |
| }} |
| ENUM!{enum DOMAIN_PASSWORD_CONSTRUCTION { |
| DomainPasswordSimple = 1, |
| DomainPasswordComplex = 2, |
| }} |
| STRUCT!{struct DOMAIN_LOGOFF_INFORMATION { |
| ForceLogoff: LARGE_INTEGER, |
| }} |
| pub type PDOMAIN_LOGOFF_INFORMATION = *mut DOMAIN_LOGOFF_INFORMATION; |
| STRUCT!{struct DOMAIN_OEM_INFORMATION { |
| OemInformation: UNICODE_STRING, |
| }} |
| pub type PDOMAIN_OEM_INFORMATION = *mut DOMAIN_OEM_INFORMATION; |
| STRUCT!{struct DOMAIN_NAME_INFORMATION { |
| DomainName: UNICODE_STRING, |
| }} |
| pub type PDOMAIN_NAME_INFORMATION = *mut DOMAIN_NAME_INFORMATION; |
| STRUCT!{struct DOMAIN_SERVER_ROLE_INFORMATION { |
| DomainServerRole: DOMAIN_SERVER_ROLE, |
| }} |
| pub type PDOMAIN_SERVER_ROLE_INFORMATION = *mut DOMAIN_SERVER_ROLE_INFORMATION; |
| STRUCT!{struct DOMAIN_REPLICATION_INFORMATION { |
| ReplicaSourceNodeName: UNICODE_STRING, |
| }} |
| pub type PDOMAIN_REPLICATION_INFORMATION = *mut DOMAIN_REPLICATION_INFORMATION; |
| STRUCT!{struct DOMAIN_MODIFIED_INFORMATION { |
| DomainModifiedCount: LARGE_INTEGER, |
| CreationTime: LARGE_INTEGER, |
| }} |
| pub type PDOMAIN_MODIFIED_INFORMATION = *mut DOMAIN_MODIFIED_INFORMATION; |
| STRUCT!{struct DOMAIN_MODIFIED_INFORMATION2 { |
| DomainModifiedCount: LARGE_INTEGER, |
| CreationTime: LARGE_INTEGER, |
| ModifiedCountAtLastPromotion: LARGE_INTEGER, |
| }} |
| pub type PDOMAIN_MODIFIED_INFORMATION2 = *mut DOMAIN_MODIFIED_INFORMATION2; |
| STRUCT!{struct DOMAIN_STATE_INFORMATION { |
| DomainServerState: DOMAIN_SERVER_ENABLE_STATE, |
| }} |
| pub type PDOMAIN_STATE_INFORMATION = *mut DOMAIN_STATE_INFORMATION; |
| STRUCT!{struct DOMAIN_LOCKOUT_INFORMATION { |
| LockoutDuration: LARGE_INTEGER, |
| LockoutObservationWindow: LARGE_INTEGER, |
| LockoutThreshold: USHORT, |
| }} |
| pub type PDOMAIN_LOCKOUT_INFORMATION = *mut DOMAIN_LOCKOUT_INFORMATION; |
| ENUM!{enum DOMAIN_DISPLAY_INFORMATION { |
| DomainDisplayUser = 1, |
| DomainDisplayMachine = 2, |
| DomainDisplayGroup = 3, |
| DomainDisplayOemUser = 4, |
| DomainDisplayOemGroup = 5, |
| DomainDisplayServer = 6, |
| }} |
| pub type PDOMAIN_DISPLAY_INFORMATION = *mut DOMAIN_DISPLAY_INFORMATION; |
| STRUCT!{struct DOMAIN_DISPLAY_USER { |
| Index: ULONG, |
| Rid: ULONG, |
| AccountControl: ULONG, |
| LogonName: UNICODE_STRING, |
| AdminComment: UNICODE_STRING, |
| FullName: UNICODE_STRING, |
| }} |
| pub type PDOMAIN_DISPLAY_USER = *mut DOMAIN_DISPLAY_USER; |
| STRUCT!{struct DOMAIN_DISPLAY_MACHINE { |
| Index: ULONG, |
| Rid: ULONG, |
| AccountControl: ULONG, |
| Machine: UNICODE_STRING, |
| Comment: UNICODE_STRING, |
| }} |
| pub type PDOMAIN_DISPLAY_MACHINE = *mut DOMAIN_DISPLAY_MACHINE; |
| STRUCT!{struct DOMAIN_DISPLAY_GROUP { |
| Index: ULONG, |
| Rid: ULONG, |
| Attributes: ULONG, |
| Group: UNICODE_STRING, |
| Comment: UNICODE_STRING, |
| }} |
| pub type PDOMAIN_DISPLAY_GROUP = *mut DOMAIN_DISPLAY_GROUP; |
| STRUCT!{struct DOMAIN_DISPLAY_OEM_USER { |
| Index: ULONG, |
| User: OEM_STRING, |
| }} |
| pub type PDOMAIN_DISPLAY_OEM_USER = *mut DOMAIN_DISPLAY_OEM_USER; |
| STRUCT!{struct DOMAIN_DISPLAY_OEM_GROUP { |
| Index: ULONG, |
| Group: OEM_STRING, |
| }} |
| pub type PDOMAIN_DISPLAY_OEM_GROUP = *mut DOMAIN_DISPLAY_OEM_GROUP; |
| ENUM!{enum DOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION { |
| DomainLocalizableAccountsBasic = 1, |
| }} |
| pub type PDOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION = *mut DOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION; |
| STRUCT!{struct DOMAIN_LOCALIZABLE_ACCOUNT_ENTRY { |
| Rid: ULONG, |
| Use: SID_NAME_USE, |
| Name: UNICODE_STRING, |
| AdminComment: UNICODE_STRING, |
| }} |
| pub type PDOMAIN_LOCALIZABLE_ACCOUNT_ENTRY = *mut DOMAIN_LOCALIZABLE_ACCOUNT_ENTRY; |
| STRUCT!{struct DOMAIN_LOCALIZABLE_ACCOUNTS_BASIC { |
| Count: ULONG, |
| Entries: *mut DOMAIN_LOCALIZABLE_ACCOUNT_ENTRY, |
| }} |
| pub type PDOMAIN_LOCALIZABLE_ACCOUNTS_BASIC = *mut DOMAIN_LOCALIZABLE_ACCOUNTS_BASIC; |
| UNION!{union DOMAIN_LOCALIZABLE_ACCOUNTS_INFO_BUFFER { |
| Basic: DOMAIN_LOCALIZABLE_ACCOUNTS_BASIC, |
| }} |
| pub type PDOMAIN_LOCALIZABLE_ACCOUNTS_INFO_BUFFER = *mut DOMAIN_LOCALIZABLE_ACCOUNTS_INFO_BUFFER; |
| EXTERN!{extern "system" { |
| fn SamLookupDomainInSamServer( |
| ServerHandle: SAM_HANDLE, |
| Name: PUNICODE_STRING, |
| DomainId: *mut PSID, |
| ) -> NTSTATUS; |
| fn SamEnumerateDomainsInSamServer( |
| ServerHandle: SAM_HANDLE, |
| EnumerationContext: PSAM_ENUMERATE_HANDLE, |
| Buffer: *mut PVOID, |
| PreferedMaximumLength: ULONG, |
| CountReturned: PULONG, |
| ) -> NTSTATUS; |
| fn SamOpenDomain( |
| ServerHandle: SAM_HANDLE, |
| DesiredAccess: ACCESS_MASK, |
| DomainId: PSID, |
| DomainHandle: PSAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamQueryInformationDomain( |
| DomainHandle: SAM_HANDLE, |
| DomainInformationClass: DOMAIN_INFORMATION_CLASS, |
| Buffer: *mut PVOID, |
| ) -> NTSTATUS; |
| fn SamSetInformationDomain( |
| DomainHandle: SAM_HANDLE, |
| DomainInformationClass: DOMAIN_INFORMATION_CLASS, |
| DomainInformation: PVOID, |
| ) -> NTSTATUS; |
| fn SamLookupNamesInDomain( |
| DomainHandle: SAM_HANDLE, |
| Count: ULONG, |
| Names: PUNICODE_STRING, |
| RelativeIds: *mut PULONG, |
| Use: *mut PSID_NAME_USE, |
| ) -> NTSTATUS; |
| fn SamLookupIdsInDomain( |
| DomainHandle: SAM_HANDLE, |
| Count: ULONG, |
| RelativeIds: PULONG, |
| Names: *mut PUNICODE_STRING, |
| Use: *mut PSID_NAME_USE, |
| ) -> NTSTATUS; |
| fn SamRemoveMemberFromForeignDomain( |
| DomainHandle: SAM_HANDLE, |
| MemberId: PSID, |
| ) -> NTSTATUS; |
| fn SamQueryLocalizableAccountsInDomain( |
| Domain: SAM_HANDLE, |
| Flags: ULONG, |
| LanguageId: ULONG, |
| Class: DOMAIN_LOCALIZABLE_ACCOUNTS_INFORMATION, |
| Buffer: *mut PVOID, |
| ) -> NTSTATUS; |
| }} |
| pub const GROUP_READ_INFORMATION: ACCESS_MASK = 0x0001; |
| pub const GROUP_WRITE_ACCOUNT: ACCESS_MASK = 0x0002; |
| pub const GROUP_ADD_MEMBER: ACCESS_MASK = 0x0004; |
| pub const GROUP_REMOVE_MEMBER: ACCESS_MASK = 0x0008; |
| pub const GROUP_LIST_MEMBERS: ACCESS_MASK = 0x0010; |
| pub const GROUP_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | GROUP_LIST_MEMBERS |
| | GROUP_WRITE_ACCOUNT | GROUP_ADD_MEMBER | GROUP_REMOVE_MEMBER | GROUP_READ_INFORMATION; |
| pub const GROUP_READ: ACCESS_MASK = STANDARD_RIGHTS_READ | GROUP_LIST_MEMBERS; |
| pub const GROUP_WRITE: ACCESS_MASK = |
| STANDARD_RIGHTS_WRITE | GROUP_WRITE_ACCOUNT | GROUP_ADD_MEMBER | GROUP_REMOVE_MEMBER; |
| pub const GROUP_EXECUTE: ACCESS_MASK = STANDARD_RIGHTS_EXECUTE | GROUP_READ_INFORMATION; |
| STRUCT!{struct GROUP_MEMBERSHIP { |
| RelativeId: ULONG, |
| Attributes: ULONG, |
| }} |
| pub type PGROUP_MEMBERSHIP = *mut GROUP_MEMBERSHIP; |
| ENUM!{enum GROUP_INFORMATION_CLASS { |
| GroupGeneralInformation = 1, |
| GroupNameInformation = 2, |
| GroupAttributeInformation = 3, |
| GroupAdminCommentInformation = 4, |
| GroupReplicationInformation = 5, |
| }} |
| STRUCT!{struct GROUP_GENERAL_INFORMATION { |
| Name: UNICODE_STRING, |
| Attributes: ULONG, |
| MemberCount: ULONG, |
| AdminComment: UNICODE_STRING, |
| }} |
| pub type PGROUP_GENERAL_INFORMATION = *mut GROUP_GENERAL_INFORMATION; |
| STRUCT!{struct GROUP_NAME_INFORMATION { |
| Name: UNICODE_STRING, |
| }} |
| pub type PGROUP_NAME_INFORMATION = *mut GROUP_NAME_INFORMATION; |
| STRUCT!{struct GROUP_ATTRIBUTE_INFORMATION { |
| Attributes: ULONG, |
| }} |
| pub type PGROUP_ATTRIBUTE_INFORMATION = *mut GROUP_ATTRIBUTE_INFORMATION; |
| STRUCT!{struct GROUP_ADM_COMMENT_INFORMATION { |
| AdminComment: UNICODE_STRING, |
| }} |
| pub type PGROUP_ADM_COMMENT_INFORMATION = *mut GROUP_ADM_COMMENT_INFORMATION; |
| EXTERN!{extern "system" { |
| fn SamEnumerateGroupsInDomain( |
| DomainHandle: SAM_HANDLE, |
| EnumerationContext: PSAM_ENUMERATE_HANDLE, |
| Buffer: *mut PVOID, |
| PreferedMaximumLength: ULONG, |
| CountReturned: PULONG, |
| ) -> NTSTATUS; |
| fn SamCreateGroupInDomain( |
| DomainHandle: SAM_HANDLE, |
| AccountName: PUNICODE_STRING, |
| DesiredAccess: ACCESS_MASK, |
| GroupHandle: PSAM_HANDLE, |
| RelativeId: PULONG, |
| ) -> NTSTATUS; |
| fn SamOpenGroup( |
| DomainHandle: SAM_HANDLE, |
| DesiredAccess: ACCESS_MASK, |
| GroupId: ULONG, |
| GroupHandle: PSAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamDeleteGroup( |
| GroupHandle: SAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamQueryInformationGroup( |
| GroupHandle: SAM_HANDLE, |
| GroupInformationClass: GROUP_INFORMATION_CLASS, |
| Buffer: *mut PVOID, |
| ) -> NTSTATUS; |
| fn SamSetInformationGroup( |
| GroupHandle: SAM_HANDLE, |
| GroupInformationClass: GROUP_INFORMATION_CLASS, |
| Buffer: PVOID, |
| ) -> NTSTATUS; |
| fn SamAddMemberToGroup( |
| GroupHandle: SAM_HANDLE, |
| MemberId: ULONG, |
| Attributes: ULONG, |
| ) -> NTSTATUS; |
| fn SamRemoveMemberFromGroup( |
| GroupHandle: SAM_HANDLE, |
| MemberId: ULONG, |
| ) -> NTSTATUS; |
| fn SamGetMembersInGroup( |
| GroupHandle: SAM_HANDLE, |
| MemberIds: *mut PULONG, |
| Attributes: *mut PULONG, |
| MemberCount: PULONG, |
| ) -> NTSTATUS; |
| fn SamSetMemberAttributesOfGroup( |
| GroupHandle: SAM_HANDLE, |
| MemberId: ULONG, |
| Attributes: ULONG, |
| ) -> NTSTATUS; |
| }} |
| pub const ALIAS_ADD_MEMBER: ACCESS_MASK = 0x0001; |
| pub const ALIAS_REMOVE_MEMBER: ACCESS_MASK = 0x0002; |
| pub const ALIAS_LIST_MEMBERS: ACCESS_MASK = 0x0004; |
| pub const ALIAS_READ_INFORMATION: ACCESS_MASK = 0x0008; |
| pub const ALIAS_WRITE_ACCOUNT: ACCESS_MASK = 0x0010; |
| pub const ALIAS_ALL_ACCESS: ACCESS_MASK = STANDARD_RIGHTS_REQUIRED | ALIAS_READ_INFORMATION |
| | ALIAS_WRITE_ACCOUNT | ALIAS_LIST_MEMBERS | ALIAS_ADD_MEMBER | ALIAS_REMOVE_MEMBER; |
| pub const ALIAS_READ: ACCESS_MASK = STANDARD_RIGHTS_READ | ALIAS_LIST_MEMBERS; |
| pub const ALIAS_WRITE: ACCESS_MASK = |
| STANDARD_RIGHTS_WRITE | ALIAS_WRITE_ACCOUNT | ALIAS_ADD_MEMBER | ALIAS_REMOVE_MEMBER; |
| pub const ALIAS_EXECUTE: ACCESS_MASK = STANDARD_RIGHTS_EXECUTE | ALIAS_READ_INFORMATION; |
| ENUM!{enum ALIAS_INFORMATION_CLASS { |
| AliasGeneralInformation = 1, |
| AliasNameInformation = 2, |
| AliasAdminCommentInformation = 3, |
| AliasReplicationInformation = 4, |
| AliasExtendedInformation = 5, |
| }} |
| STRUCT!{struct ALIAS_GENERAL_INFORMATION { |
| Name: UNICODE_STRING, |
| MemberCount: ULONG, |
| AdminComment: UNICODE_STRING, |
| }} |
| pub type PALIAS_GENERAL_INFORMATION = *mut ALIAS_GENERAL_INFORMATION; |
| STRUCT!{struct ALIAS_NAME_INFORMATION { |
| Name: UNICODE_STRING, |
| }} |
| pub type PALIAS_NAME_INFORMATION = *mut ALIAS_NAME_INFORMATION; |
| STRUCT!{struct ALIAS_ADM_COMMENT_INFORMATION { |
| AdminComment: UNICODE_STRING, |
| }} |
| pub type PALIAS_ADM_COMMENT_INFORMATION = *mut ALIAS_ADM_COMMENT_INFORMATION; |
| pub const ALIAS_ALL_NAME: ULONG = 0x00000001; |
| pub const ALIAS_ALL_MEMBER_COUNT: ULONG = 0x00000002; |
| pub const ALIAS_ALL_ADMIN_COMMENT: ULONG = 0x00000004; |
| pub const ALIAS_ALL_SHELL_ADMIN_OBJECT_PROPERTIES: ULONG = 0x00000008; |
| STRUCT!{struct ALIAS_EXTENDED_INFORMATION { |
| WhichFields: ULONG, |
| ShellAdminObjectProperties: SAM_SHELL_OBJECT_PROPERTIES, |
| }} |
| pub type PALIAS_EXTENDED_INFORMATION = *mut ALIAS_EXTENDED_INFORMATION; |
| EXTERN!{extern "system" { |
| fn SamEnumerateAliasesInDomain( |
| DomainHandle: SAM_HANDLE, |
| EnumerationContext: PSAM_ENUMERATE_HANDLE, |
| Buffer: *mut PVOID, |
| PreferedMaximumLength: ULONG, |
| CountReturned: PULONG, |
| ) -> NTSTATUS; |
| fn SamCreateAliasInDomain( |
| DomainHandle: SAM_HANDLE, |
| AccountName: PUNICODE_STRING, |
| DesiredAccess: ACCESS_MASK, |
| AliasHandle: PSAM_HANDLE, |
| RelativeId: PULONG, |
| ) -> NTSTATUS; |
| fn SamOpenAlias( |
| DomainHandle: SAM_HANDLE, |
| DesiredAccess: ACCESS_MASK, |
| AliasId: ULONG, |
| AliasHandle: PSAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamDeleteAlias( |
| AliasHandle: SAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamQueryInformationAlias( |
| AliasHandle: SAM_HANDLE, |
| AliasInformationClass: ALIAS_INFORMATION_CLASS, |
| Buffer: *mut PVOID, |
| ) -> NTSTATUS; |
| fn SamSetInformationAlias( |
| AliasHandle: SAM_HANDLE, |
| AliasInformationClass: ALIAS_INFORMATION_CLASS, |
| Buffer: PVOID, |
| ) -> NTSTATUS; |
| fn SamAddMemberToAlias( |
| AliasHandle: SAM_HANDLE, |
| MemberId: PSID, |
| ) -> NTSTATUS; |
| fn SamAddMultipleMembersToAlias( |
| AliasHandle: SAM_HANDLE, |
| MemberIds: *mut PSID, |
| MemberCount: ULONG, |
| ) -> NTSTATUS; |
| fn SamRemoveMemberFromAlias( |
| AliasHandle: SAM_HANDLE, |
| MemberId: PSID, |
| ) -> NTSTATUS; |
| fn SamRemoveMultipleMembersFromAlias( |
| AliasHandle: SAM_HANDLE, |
| MemberIds: *mut PSID, |
| MemberCount: ULONG, |
| ) -> NTSTATUS; |
| fn SamGetMembersInAlias( |
| AliasHandle: SAM_HANDLE, |
| MemberIds: *mut *mut PSID, |
| MemberCount: PULONG, |
| ) -> NTSTATUS; |
| fn SamGetAliasMembership( |
| DomainHandle: SAM_HANDLE, |
| PassedCount: ULONG, |
| Sids: *mut PSID, |
| MembershipCount: PULONG, |
| Aliases: *mut PULONG, |
| ) -> NTSTATUS; |
| }} |
| pub const GROUP_TYPE_BUILTIN_LOCAL_GROUP: u32 = 0x00000001; |
| pub const GROUP_TYPE_ACCOUNT_GROUP: u32 = 0x00000002; |
| pub const GROUP_TYPE_RESOURCE_GROUP: u32 = 0x00000004; |
| pub const GROUP_TYPE_UNIVERSAL_GROUP: u32 = 0x00000008; |
| pub const GROUP_TYPE_APP_BASIC_GROUP: u32 = 0x00000010; |
| pub const GROUP_TYPE_APP_QUERY_GROUP: u32 = 0x00000020; |
| pub const GROUP_TYPE_SECURITY_ENABLED: u32 = 0x80000000; |
| pub const GROUP_TYPE_RESOURCE_BEHAVOIR: u32 = |
| GROUP_TYPE_RESOURCE_GROUP | GROUP_TYPE_APP_BASIC_GROUP | GROUP_TYPE_APP_QUERY_GROUP; |
| pub const USER_READ_GENERAL: DWORD = 0x0001; |
| pub const USER_READ_PREFERENCES: DWORD = 0x0002; |
| pub const USER_WRITE_PREFERENCES: DWORD = 0x0004; |
| pub const USER_READ_LOGON: DWORD = 0x0008; |
| pub const USER_READ_ACCOUNT: DWORD = 0x0010; |
| pub const USER_WRITE_ACCOUNT: DWORD = 0x0020; |
| pub const USER_CHANGE_PASSWORD: DWORD = 0x0040; |
| pub const USER_FORCE_PASSWORD_CHANGE: DWORD = 0x0080; |
| pub const USER_LIST_GROUPS: DWORD = 0x0100; |
| pub const USER_READ_GROUP_INFORMATION: DWORD = 0x0200; |
| pub const USER_WRITE_GROUP_INFORMATION: DWORD = 0x0400; |
| pub const USER_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED | USER_READ_PREFERENCES |
| | USER_READ_LOGON | USER_LIST_GROUPS | USER_READ_GROUP_INFORMATION | USER_WRITE_PREFERENCES |
| | USER_CHANGE_PASSWORD | USER_FORCE_PASSWORD_CHANGE | USER_READ_GENERAL | USER_READ_ACCOUNT |
| | USER_WRITE_ACCOUNT | USER_WRITE_GROUP_INFORMATION; |
| pub const USER_READ: DWORD = STANDARD_RIGHTS_READ | USER_READ_PREFERENCES | USER_READ_LOGON |
| | USER_READ_ACCOUNT | USER_LIST_GROUPS | USER_READ_GROUP_INFORMATION; |
| pub const USER_WRITE: DWORD = |
| STANDARD_RIGHTS_WRITE | USER_WRITE_PREFERENCES | USER_CHANGE_PASSWORD; |
| pub const USER_EXECUTE: DWORD = STANDARD_RIGHTS_EXECUTE | USER_READ_GENERAL | USER_CHANGE_PASSWORD; |
| ENUM!{enum USER_INFORMATION_CLASS { |
| UserGeneralInformation = 1, |
| UserPreferencesInformation = 2, |
| UserLogonInformation = 3, |
| UserLogonHoursInformation = 4, |
| UserAccountInformation = 5, |
| UserNameInformation = 6, |
| UserAccountNameInformation = 7, |
| UserFullNameInformation = 8, |
| UserPrimaryGroupInformation = 9, |
| UserHomeInformation = 10, |
| UserScriptInformation = 11, |
| UserProfileInformation = 12, |
| UserAdminCommentInformation = 13, |
| UserWorkStationsInformation = 14, |
| UserSetPasswordInformation = 15, |
| UserControlInformation = 16, |
| UserExpiresInformation = 17, |
| UserInternal1Information = 18, |
| UserInternal2Information = 19, |
| UserParametersInformation = 20, |
| UserAllInformation = 21, |
| UserInternal3Information = 22, |
| UserInternal4Information = 23, |
| UserInternal5Information = 24, |
| UserInternal4InformationNew = 25, |
| UserInternal5InformationNew = 26, |
| UserInternal6Information = 27, |
| UserExtendedInformation = 28, |
| UserLogonUIInformation = 29, |
| }} |
| pub type PUSER_INFORMATION_CLASS = *mut USER_INFORMATION_CLASS; |
| pub const USER_ALL_USERNAME: ULONG = 0x00000001; |
| pub const USER_ALL_FULLNAME: ULONG = 0x00000002; |
| pub const USER_ALL_USERID: ULONG = 0x00000004; |
| pub const USER_ALL_PRIMARYGROUPID: ULONG = 0x00000008; |
| pub const USER_ALL_ADMINCOMMENT: ULONG = 0x00000010; |
| pub const USER_ALL_USERCOMMENT: ULONG = 0x00000020; |
| pub const USER_ALL_HOMEDIRECTORY: ULONG = 0x00000040; |
| pub const USER_ALL_HOMEDIRECTORYDRIVE: ULONG = 0x00000080; |
| pub const USER_ALL_SCRIPTPATH: ULONG = 0x00000100; |
| pub const USER_ALL_PROFILEPATH: ULONG = 0x00000200; |
| pub const USER_ALL_WORKSTATIONS: ULONG = 0x00000400; |
| pub const USER_ALL_LASTLOGON: ULONG = 0x00000800; |
| pub const USER_ALL_LASTLOGOFF: ULONG = 0x00001000; |
| pub const USER_ALL_LOGONHOURS: ULONG = 0x00002000; |
| pub const USER_ALL_BADPASSWORDCOUNT: ULONG = 0x00004000; |
| pub const USER_ALL_LOGONCOUNT: ULONG = 0x00008000; |
| pub const USER_ALL_PASSWORDCANCHANGE: ULONG = 0x00010000; |
| pub const USER_ALL_PASSWORDMUSTCHANGE: ULONG = 0x00020000; |
| pub const USER_ALL_PASSWORDLASTSET: ULONG = 0x00040000; |
| pub const USER_ALL_ACCOUNTEXPIRES: ULONG = 0x00080000; |
| pub const USER_ALL_USERACCOUNTCONTROL: ULONG = 0x00100000; |
| pub const USER_ALL_PARAMETERS: ULONG = 0x00200000; |
| pub const USER_ALL_COUNTRYCODE: ULONG = 0x00400000; |
| pub const USER_ALL_CODEPAGE: ULONG = 0x00800000; |
| pub const USER_ALL_NTPASSWORDPRESENT: ULONG = 0x01000000; |
| pub const USER_ALL_LMPASSWORDPRESENT: ULONG = 0x02000000; |
| pub const USER_ALL_PRIVATEDATA: ULONG = 0x04000000; |
| pub const USER_ALL_PASSWORDEXPIRED: ULONG = 0x08000000; |
| pub const USER_ALL_SECURITYDESCRIPTOR: ULONG = 0x10000000; |
| pub const USER_ALL_OWFPASSWORD: ULONG = 0x20000000; |
| pub const USER_ALL_UNDEFINED_MASK: ULONG = 0xc0000000; |
| pub const USER_ALL_READ_GENERAL_MASK: ULONG = USER_ALL_USERNAME | USER_ALL_FULLNAME |
| | USER_ALL_USERID | USER_ALL_PRIMARYGROUPID | USER_ALL_ADMINCOMMENT | USER_ALL_USERCOMMENT; |
| pub const USER_ALL_READ_LOGON_MASK: ULONG = USER_ALL_HOMEDIRECTORY | USER_ALL_HOMEDIRECTORYDRIVE |
| | USER_ALL_SCRIPTPATH | USER_ALL_PROFILEPATH | USER_ALL_WORKSTATIONS | USER_ALL_LASTLOGON |
| | USER_ALL_LASTLOGOFF | USER_ALL_LOGONHOURS | USER_ALL_BADPASSWORDCOUNT | USER_ALL_LOGONCOUNT |
| | USER_ALL_PASSWORDCANCHANGE | USER_ALL_PASSWORDMUSTCHANGE; |
| pub const USER_ALL_READ_ACCOUNT_MASK: ULONG = USER_ALL_PASSWORDLASTSET | USER_ALL_ACCOUNTEXPIRES |
| | USER_ALL_USERACCOUNTCONTROL | USER_ALL_PARAMETERS; |
| pub const USER_ALL_READ_PREFERENCES_MASK: ULONG = USER_ALL_COUNTRYCODE | USER_ALL_CODEPAGE; |
| pub const USER_ALL_READ_TRUSTED_MASK: ULONG = USER_ALL_NTPASSWORDPRESENT |
| | USER_ALL_LMPASSWORDPRESENT | USER_ALL_PASSWORDEXPIRED | USER_ALL_SECURITYDESCRIPTOR |
| | USER_ALL_PRIVATEDATA; |
| pub const USER_ALL_READ_CANT_MASK: ULONG = USER_ALL_UNDEFINED_MASK; |
| pub const USER_ALL_WRITE_ACCOUNT_MASK: ULONG = USER_ALL_USERNAME | USER_ALL_FULLNAME |
| | USER_ALL_PRIMARYGROUPID | USER_ALL_HOMEDIRECTORY | USER_ALL_HOMEDIRECTORYDRIVE |
| | USER_ALL_SCRIPTPATH | USER_ALL_PROFILEPATH | USER_ALL_ADMINCOMMENT | USER_ALL_WORKSTATIONS |
| | USER_ALL_LOGONHOURS | USER_ALL_ACCOUNTEXPIRES | USER_ALL_USERACCOUNTCONTROL |
| | USER_ALL_PARAMETERS; |
| pub const USER_ALL_WRITE_PREFERENCES_MASK: ULONG = |
| USER_ALL_USERCOMMENT | USER_ALL_COUNTRYCODE | USER_ALL_CODEPAGE; |
| pub const USER_ALL_WRITE_FORCE_PASSWORD_CHANGE_MASK: ULONG = |
| USER_ALL_NTPASSWORDPRESENT | USER_ALL_LMPASSWORDPRESENT | USER_ALL_PASSWORDEXPIRED; |
| pub const USER_ALL_WRITE_TRUSTED_MASK: ULONG = USER_ALL_LASTLOGON | USER_ALL_LASTLOGOFF |
| | USER_ALL_BADPASSWORDCOUNT | USER_ALL_LOGONCOUNT | USER_ALL_PASSWORDLASTSET |
| | USER_ALL_SECURITYDESCRIPTOR | USER_ALL_PRIVATEDATA; |
| pub const USER_ALL_WRITE_CANT_MASK: ULONG = USER_ALL_USERID | USER_ALL_PASSWORDCANCHANGE |
| | USER_ALL_PASSWORDMUSTCHANGE | USER_ALL_UNDEFINED_MASK; |
| STRUCT!{struct USER_GENERAL_INFORMATION { |
| UserName: UNICODE_STRING, |
| FullName: UNICODE_STRING, |
| PrimaryGroupId: ULONG, |
| AdminComment: UNICODE_STRING, |
| UserComment: UNICODE_STRING, |
| }} |
| pub type PUSER_GENERAL_INFORMATION = *mut USER_GENERAL_INFORMATION; |
| STRUCT!{struct USER_PREFERENCES_INFORMATION { |
| UserComment: UNICODE_STRING, |
| Reserved1: UNICODE_STRING, |
| CountryCode: USHORT, |
| CodePage: USHORT, |
| }} |
| pub type PUSER_PREFERENCES_INFORMATION = *mut USER_PREFERENCES_INFORMATION; |
| STRUCT!{struct USER_PARAMETERS_INFORMATION { |
| Parameters: UNICODE_STRING, |
| }} |
| pub type PUSER_PARAMETERS_INFORMATION = *mut USER_PARAMETERS_INFORMATION; |
| STRUCT!{#[repr(packed(4))] struct USER_LOGON_INFORMATION { |
| UserName: UNICODE_STRING, |
| FullName: UNICODE_STRING, |
| UserId: ULONG, |
| PrimaryGroupId: ULONG, |
| HomeDirectory: UNICODE_STRING, |
| HomeDirectoryDrive: UNICODE_STRING, |
| ScriptPath: UNICODE_STRING, |
| ProfilePath: UNICODE_STRING, |
| WorkStations: UNICODE_STRING, |
| LastLogon: LARGE_INTEGER, |
| LastLogoff: LARGE_INTEGER, |
| PasswordLastSet: LARGE_INTEGER, |
| PasswordCanChange: LARGE_INTEGER, |
| PasswordMustChange: LARGE_INTEGER, |
| LogonHours: LOGON_HOURS, |
| BadPasswordCount: USHORT, |
| LogonCount: USHORT, |
| UserAccountControl: ULONG, |
| }} |
| pub type PUSER_LOGON_INFORMATION = *mut USER_LOGON_INFORMATION; |
| STRUCT!{#[repr(packed(4))] struct USER_ACCOUNT_INFORMATION { |
| UserName: UNICODE_STRING, |
| FullName: UNICODE_STRING, |
| UserId: ULONG, |
| PrimaryGroupId: ULONG, |
| HomeDirectory: UNICODE_STRING, |
| HomeDirectoryDrive: UNICODE_STRING, |
| ScriptPath: UNICODE_STRING, |
| ProfilePath: UNICODE_STRING, |
| AdminComment: UNICODE_STRING, |
| WorkStations: UNICODE_STRING, |
| LastLogon: LARGE_INTEGER, |
| LastLogoff: LARGE_INTEGER, |
| LogonHours: LOGON_HOURS, |
| BadPasswordCount: USHORT, |
| LogonCount: USHORT, |
| PasswordLastSet: LARGE_INTEGER, |
| AccountExpires: LARGE_INTEGER, |
| UserAccountControl: ULONG, |
| }} |
| pub type PUSER_ACCOUNT_INFORMATION = *mut USER_ACCOUNT_INFORMATION; |
| STRUCT!{struct USER_ACCOUNT_NAME_INFORMATION { |
| UserName: UNICODE_STRING, |
| }} |
| pub type PUSER_ACCOUNT_NAME_INFORMATION = *mut USER_ACCOUNT_NAME_INFORMATION; |
| STRUCT!{struct USER_FULL_NAME_INFORMATION { |
| FullName: UNICODE_STRING, |
| }} |
| pub type PUSER_FULL_NAME_INFORMATION = *mut USER_FULL_NAME_INFORMATION; |
| STRUCT!{struct USER_NAME_INFORMATION { |
| UserName: UNICODE_STRING, |
| FullName: UNICODE_STRING, |
| }} |
| pub type PUSER_NAME_INFORMATION = *mut USER_NAME_INFORMATION; |
| STRUCT!{struct USER_PRIMARY_GROUP_INFORMATION { |
| PrimaryGroupId: ULONG, |
| }} |
| pub type PUSER_PRIMARY_GROUP_INFORMATION = *mut USER_PRIMARY_GROUP_INFORMATION; |
| STRUCT!{struct USER_HOME_INFORMATION { |
| HomeDirectory: UNICODE_STRING, |
| HomeDirectoryDrive: UNICODE_STRING, |
| }} |
| pub type PUSER_HOME_INFORMATION = *mut USER_HOME_INFORMATION; |
| STRUCT!{struct USER_SCRIPT_INFORMATION { |
| ScriptPath: UNICODE_STRING, |
| }} |
| pub type PUSER_SCRIPT_INFORMATION = *mut USER_SCRIPT_INFORMATION; |
| STRUCT!{struct USER_PROFILE_INFORMATION { |
| ProfilePath: UNICODE_STRING, |
| }} |
| pub type PUSER_PROFILE_INFORMATION = *mut USER_PROFILE_INFORMATION; |
| STRUCT!{struct USER_ADMIN_COMMENT_INFORMATION { |
| AdminComment: UNICODE_STRING, |
| }} |
| pub type PUSER_ADMIN_COMMENT_INFORMATION = *mut USER_ADMIN_COMMENT_INFORMATION; |
| STRUCT!{struct USER_WORKSTATIONS_INFORMATION { |
| WorkStations: UNICODE_STRING, |
| }} |
| pub type PUSER_WORKSTATIONS_INFORMATION = *mut USER_WORKSTATIONS_INFORMATION; |
| STRUCT!{struct USER_SET_PASSWORD_INFORMATION { |
| Password: UNICODE_STRING, |
| PasswordExpired: BOOLEAN, |
| }} |
| pub type PUSER_SET_PASSWORD_INFORMATION = *mut USER_SET_PASSWORD_INFORMATION; |
| STRUCT!{struct USER_CONTROL_INFORMATION { |
| UserAccountControl: ULONG, |
| }} |
| pub type PUSER_CONTROL_INFORMATION = *mut USER_CONTROL_INFORMATION; |
| STRUCT!{struct USER_EXPIRES_INFORMATION { |
| AccountExpires: LARGE_INTEGER, |
| }} |
| pub type PUSER_EXPIRES_INFORMATION = *mut USER_EXPIRES_INFORMATION; |
| STRUCT!{struct USER_LOGON_HOURS_INFORMATION { |
| LogonHours: LOGON_HOURS, |
| }} |
| pub type PUSER_LOGON_HOURS_INFORMATION = *mut USER_LOGON_HOURS_INFORMATION; |
| pub type SAM_USER_TILE = SAM_BYTE_ARRAY_32K; |
| pub type PSAM_USER_TILE = *mut SAM_BYTE_ARRAY_32K; |
| pub const USER_EXTENDED_FIELD_USER_TILE: ULONG = 0x00001000; |
| pub const USER_EXTENDED_FIELD_PASSWORD_HINT: ULONG = 0x00002000; |
| pub const USER_EXTENDED_FIELD_DONT_SHOW_IN_LOGON_UI: ULONG = 0x00004000; |
| pub const USER_EXTENDED_FIELD_SHELL_ADMIN_OBJECT_PROPERTIES: ULONG = 0x00008000; |
| STRUCT!{struct USER_EXTENDED_INFORMATION { |
| ExtendedWhichFields: ULONG, |
| UserTile: SAM_USER_TILE, |
| PasswordHint: UNICODE_STRING, |
| DontShowInLogonUI: BOOLEAN, |
| ShellAdminObjectProperties: SAM_SHELL_OBJECT_PROPERTIES, |
| }} |
| pub type PUSER_EXTENDED_INFORMATION = *mut USER_EXTENDED_INFORMATION; |
| STRUCT!{struct USER_LOGON_UI_INFORMATION { |
| PasswordIsBlank: BOOLEAN, |
| AccountIsDisabled: BOOLEAN, |
| }} |
| pub type PUSER_LOGON_UI_INFORMATION = *mut USER_LOGON_UI_INFORMATION; |
| STRUCT!{struct USER_PWD_CHANGE_FAILURE_INFORMATION { |
| ExtendedFailureReason: ULONG, |
| FilterModuleName: UNICODE_STRING, |
| }} |
| pub type PUSER_PWD_CHANGE_FAILURE_INFORMATION = *mut USER_PWD_CHANGE_FAILURE_INFORMATION; |
| pub const SAM_PWD_CHANGE_NO_ERROR: u32 = 0; |
| pub const SAM_PWD_CHANGE_PASSWORD_TOO_SHORT: u32 = 1; |
| pub const SAM_PWD_CHANGE_PWD_IN_HISTORY: u32 = 2; |
| pub const SAM_PWD_CHANGE_USERNAME_IN_PASSWORD: u32 = 3; |
| pub const SAM_PWD_CHANGE_FULLNAME_IN_PASSWORD: u32 = 4; |
| pub const SAM_PWD_CHANGE_NOT_COMPLEX: u32 = 5; |
| pub const SAM_PWD_CHANGE_MACHINE_PASSWORD_NOT_DEFAULT: u32 = 6; |
| pub const SAM_PWD_CHANGE_FAILED_BY_FILTER: u32 = 7; |
| pub const SAM_PWD_CHANGE_PASSWORD_TOO_LONG: u32 = 8; |
| pub const SAM_PWD_CHANGE_FAILURE_REASON_MAX: u32 = 8; |
| EXTERN!{extern "system" { |
| fn SamEnumerateUsersInDomain( |
| DomainHandle: SAM_HANDLE, |
| EnumerationContext: PSAM_ENUMERATE_HANDLE, |
| UserAccountControl: ULONG, |
| Buffer: *mut PVOID, |
| PreferedMaximumLength: ULONG, |
| CountReturned: PULONG, |
| ) -> NTSTATUS; |
| fn SamCreateUserInDomain( |
| DomainHandle: SAM_HANDLE, |
| AccountName: PUNICODE_STRING, |
| DesiredAccess: ACCESS_MASK, |
| UserHandle: PSAM_HANDLE, |
| RelativeId: PULONG, |
| ) -> NTSTATUS; |
| fn SamCreateUser2InDomain( |
| DomainHandle: SAM_HANDLE, |
| AccountName: PUNICODE_STRING, |
| AccountType: ULONG, |
| DesiredAccess: ACCESS_MASK, |
| UserHandle: PSAM_HANDLE, |
| GrantedAccess: PULONG, |
| RelativeId: PULONG, |
| ) -> NTSTATUS; |
| fn SamOpenUser( |
| DomainHandle: SAM_HANDLE, |
| DesiredAccess: ACCESS_MASK, |
| UserId: ULONG, |
| UserHandle: PSAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamDeleteUser( |
| UserHandle: SAM_HANDLE, |
| ) -> NTSTATUS; |
| fn SamQueryInformationUser( |
| UserHandle: SAM_HANDLE, |
| UserInformationClass: USER_INFORMATION_CLASS, |
| Buffer: *mut PVOID, |
| ) -> NTSTATUS; |
| fn SamSetInformationUser( |
| UserHandle: SAM_HANDLE, |
| UserInformationClass: USER_INFORMATION_CLASS, |
| Buffer: PVOID, |
| ) -> NTSTATUS; |
| fn SamGetGroupsForUser( |
| UserHandle: SAM_HANDLE, |
| Groups: *mut PGROUP_MEMBERSHIP, |
| MembershipCount: PULONG, |
| ) -> NTSTATUS; |
| fn SamChangePasswordUser( |
| UserHandle: SAM_HANDLE, |
| OldPassword: PUNICODE_STRING, |
| NewPassword: PUNICODE_STRING, |
| ) -> NTSTATUS; |
| fn SamChangePasswordUser2( |
| ServerName: PUNICODE_STRING, |
| UserName: PUNICODE_STRING, |
| OldPassword: PUNICODE_STRING, |
| NewPassword: PUNICODE_STRING, |
| ) -> NTSTATUS; |
| fn SamChangePasswordUser3( |
| ServerName: PUNICODE_STRING, |
| UserName: PUNICODE_STRING, |
| OldPassword: PUNICODE_STRING, |
| NewPassword: PUNICODE_STRING, |
| EffectivePasswordPolicy: *mut PDOMAIN_PASSWORD_INFORMATION, |
| PasswordChangeFailureInfo: *mut PUSER_PWD_CHANGE_FAILURE_INFORMATION, |
| ) -> NTSTATUS; |
| fn SamQueryDisplayInformation( |
| DomainHandle: SAM_HANDLE, |
| DisplayInformation: DOMAIN_DISPLAY_INFORMATION, |
| Index: ULONG, |
| EntryCount: ULONG, |
| PreferredMaximumLength: ULONG, |
| TotalAvailable: PULONG, |
| TotalReturned: PULONG, |
| ReturnedEntryCount: PULONG, |
| SortedBuffer: *mut PVOID, |
| ) -> NTSTATUS; |
| fn SamGetDisplayEnumerationIndex( |
| DomainHandle: SAM_HANDLE, |
| DisplayInformation: DOMAIN_DISPLAY_INFORMATION, |
| Prefix: PUNICODE_STRING, |
| Index: PULONG, |
| ) -> NTSTATUS; |
| }} |
| ENUM!{enum SECURITY_DB_DELTA_TYPE { |
| SecurityDbNew = 1, |
| SecurityDbRename = 2, |
| SecurityDbDelete = 3, |
| SecurityDbChangeMemberAdd = 4, |
| SecurityDbChangeMemberSet = 5, |
| SecurityDbChangeMemberDel = 6, |
| SecurityDbChange = 7, |
| SecurityDbChangePassword = 8, |
| }} |
| pub type PSECURITY_DB_DELTA_TYPE = *mut SECURITY_DB_DELTA_TYPE; |
| ENUM!{enum SECURITY_DB_OBJECT_TYPE { |
| SecurityDbObjectSamDomain = 1, |
| SecurityDbObjectSamUser = 2, |
| SecurityDbObjectSamGroup = 3, |
| SecurityDbObjectSamAlias = 4, |
| SecurityDbObjectLsaPolicy = 5, |
| SecurityDbObjectLsaTDomain = 6, |
| SecurityDbObjectLsaAccount = 7, |
| SecurityDbObjectLsaSecret = 8, |
| }} |
| pub type PSECURITY_DB_OBJECT_TYPE = *mut SECURITY_DB_OBJECT_TYPE; |
| ENUM!{enum SAM_ACCOUNT_TYPE { |
| SamObjectUser = 1, |
| SamObjectGroup = 2, |
| SamObjectAlias = 3, |
| }} |
| pub type PSAM_ACCOUNT_TYPE = *mut SAM_ACCOUNT_TYPE; |
| pub const SAM_USER_ACCOUNT: u32 = 0x00000001; |
| pub const SAM_GLOBAL_GROUP_ACCOUNT: u32 = 0x00000002; |
| pub const SAM_LOCAL_GROUP_ACCOUNT: u32 = 0x00000004; |
| STRUCT!{struct SAM_GROUP_MEMBER_ID { |
| MemberRid: ULONG, |
| }} |
| pub type PSAM_GROUP_MEMBER_ID = *mut SAM_GROUP_MEMBER_ID; |
| STRUCT!{struct SAM_ALIAS_MEMBER_ID { |
| MemberSid: PSID, |
| }} |
| pub type PSAM_ALIAS_MEMBER_ID = *mut SAM_ALIAS_MEMBER_ID; |
| UNION!{union SAM_DELTA_DATA { |
| GroupMemberId: SAM_GROUP_MEMBER_ID, |
| AliasMemberId: SAM_ALIAS_MEMBER_ID, |
| AccountControl: ULONG, |
| }} |
| pub type PSAM_DELTA_DATA = *mut SAM_DELTA_DATA; |
| FN!{stdcall PSAM_DELTA_NOTIFICATION_ROUTINE( |
| DomainSid: PSID, |
| DeltaType: SECURITY_DB_DELTA_TYPE, |
| ObjectType: SECURITY_DB_OBJECT_TYPE, |
| ObjectRid: ULONG, |
| ObjectName: PUNICODE_STRING, |
| ModifiedCount: PLARGE_INTEGER, |
| DeltaData: PSAM_DELTA_DATA, |
| ) -> NTSTATUS} |
| pub const SAM_DELTA_NOTIFY_ROUTINE: UTF8Const = UTF8Const("DeltaNotify\0"); |
| EXTERN!{extern "system" { |
| fn SamRegisterObjectChangeNotification( |
| ObjectType: SECURITY_DB_OBJECT_TYPE, |
| NotificationEventHandle: HANDLE, |
| ) -> NTSTATUS; |
| fn SamUnregisterObjectChangeNotification( |
| ObjectType: SECURITY_DB_OBJECT_TYPE, |
| NotificationEventHandle: HANDLE, |
| ) -> NTSTATUS; |
| }} |
| pub const SAM_SID_COMPATIBILITY_ALL: u32 = 0; |
| pub const SAM_SID_COMPATIBILITY_LAX: u32 = 1; |
| pub const SAM_SID_COMPATIBILITY_STRICT: u32 = 2; |
| EXTERN!{extern "system" { |
| fn SamGetCompatibilityMode( |
| ObjectHandle: SAM_HANDLE, |
| Mode: *mut ULONG, |
| ) -> NTSTATUS; |
| }} |
| ENUM!{enum PASSWORD_POLICY_VALIDATION_TYPE { |
| SamValidateAuthentication = 1, |
| SamValidatePasswordChange = 2, |
| SamValidatePasswordReset = 3, |
| }} |
| STRUCT!{struct SAM_VALIDATE_PASSWORD_HASH { |
| Length: ULONG, |
| Hash: PUCHAR, |
| }} |
| pub type PSAM_VALIDATE_PASSWORD_HASH = *mut SAM_VALIDATE_PASSWORD_HASH; |
| pub const SAM_VALIDATE_PASSWORD_LAST_SET: u32 = 0x00000001; |
| pub const SAM_VALIDATE_BAD_PASSWORD_TIME: u32 = 0x00000002; |
| pub const SAM_VALIDATE_LOCKOUT_TIME: u32 = 0x00000004; |
| pub const SAM_VALIDATE_BAD_PASSWORD_COUNT: u32 = 0x00000008; |
| pub const SAM_VALIDATE_PASSWORD_HISTORY_LENGTH: u32 = 0x00000010; |
| pub const SAM_VALIDATE_PASSWORD_HISTORY: u32 = 0x00000020; |
| STRUCT!{struct SAM_VALIDATE_PERSISTED_FIELDS { |
| PresentFields: ULONG, |
| PasswordLastSet: LARGE_INTEGER, |
| BadPasswordTime: LARGE_INTEGER, |
| LockoutTime: LARGE_INTEGER, |
| BadPasswordCount: ULONG, |
| PasswordHistoryLength: ULONG, |
| PasswordHistory: PSAM_VALIDATE_PASSWORD_HASH, |
| }} |
| pub type PSAM_VALIDATE_PERSISTED_FIELDS = *mut SAM_VALIDATE_PERSISTED_FIELDS; |
| ENUM!{enum SAM_VALIDATE_VALIDATION_STATUS { |
| SamValidateSuccess = 0, |
| SamValidatePasswordMustChange = 1, |
| SamValidateAccountLockedOut = 2, |
| SamValidatePasswordExpired = 3, |
| SamValidatePasswordIncorrect = 4, |
| SamValidatePasswordIsInHistory = 5, |
| SamValidatePasswordTooShort = 6, |
| SamValidatePasswordTooLong = 7, |
| SamValidatePasswordNotComplexEnough = 8, |
| SamValidatePasswordTooRecent = 9, |
| SamValidatePasswordFilterError = 10, |
| }} |
| pub type PSAM_VALIDATE_VALIDATION_STATUS = *mut SAM_VALIDATE_VALIDATION_STATUS; |
| STRUCT!{struct SAM_VALIDATE_STANDARD_OUTPUT_ARG { |
| ChangedPersistedFields: SAM_VALIDATE_PERSISTED_FIELDS, |
| ValidationStatus: SAM_VALIDATE_VALIDATION_STATUS, |
| }} |
| pub type PSAM_VALIDATE_STANDARD_OUTPUT_ARG = *mut SAM_VALIDATE_STANDARD_OUTPUT_ARG; |
| STRUCT!{struct SAM_VALIDATE_AUTHENTICATION_INPUT_ARG { |
| InputPersistedFields: SAM_VALIDATE_PERSISTED_FIELDS, |
| PasswordMatched: BOOLEAN, |
| }} |
| pub type PSAM_VALIDATE_AUTHENTICATION_INPUT_ARG = *mut SAM_VALIDATE_AUTHENTICATION_INPUT_ARG; |
| STRUCT!{struct SAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG { |
| InputPersistedFields: SAM_VALIDATE_PERSISTED_FIELDS, |
| ClearPassword: UNICODE_STRING, |
| UserAccountName: UNICODE_STRING, |
| HashedPassword: SAM_VALIDATE_PASSWORD_HASH, |
| PasswordMatch: BOOLEAN, |
| }} |
| pub type PSAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG = *mut SAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG; |
| STRUCT!{struct SAM_VALIDATE_PASSWORD_RESET_INPUT_ARG { |
| InputPersistedFields: SAM_VALIDATE_PERSISTED_FIELDS, |
| ClearPassword: UNICODE_STRING, |
| UserAccountName: UNICODE_STRING, |
| HashedPassword: SAM_VALIDATE_PASSWORD_HASH, |
| PasswordMustChangeAtNextLogon: BOOLEAN, |
| ClearLockout: BOOLEAN, |
| }} |
| pub type PSAM_VALIDATE_PASSWORD_RESET_INPUT_ARG = *mut SAM_VALIDATE_PASSWORD_RESET_INPUT_ARG; |
| UNION!{union SAM_VALIDATE_INPUT_ARG { |
| ValidateAuthenticationInput: SAM_VALIDATE_AUTHENTICATION_INPUT_ARG, |
| ValidatePasswordChangeInput: SAM_VALIDATE_PASSWORD_CHANGE_INPUT_ARG, |
| ValidatePasswordResetInput: SAM_VALIDATE_PASSWORD_RESET_INPUT_ARG, |
| }} |
| pub type PSAM_VALIDATE_INPUT_ARG = *mut SAM_VALIDATE_INPUT_ARG; |
| UNION!{union SAM_VALIDATE_OUTPUT_ARG { |
| ValidateAuthenticationOutput: SAM_VALIDATE_STANDARD_OUTPUT_ARG, |
| ValidatePasswordChangeOutput: SAM_VALIDATE_STANDARD_OUTPUT_ARG, |
| ValidatePasswordResetOutput: SAM_VALIDATE_STANDARD_OUTPUT_ARG, |
| }} |
| pub type PSAM_VALIDATE_OUTPUT_ARG = *mut SAM_VALIDATE_OUTPUT_ARG; |
| EXTERN!{extern "system" { |
| fn SamValidatePassword( |
| ServerName: PUNICODE_STRING, |
| ValidationType: PASSWORD_POLICY_VALIDATION_TYPE, |
| InputArg: PSAM_VALIDATE_INPUT_ARG, |
| OutputArg: *mut PSAM_VALIDATE_OUTPUT_ARG, |
| ) -> NTSTATUS; |
| }} |
| ENUM!{enum SAM_GENERIC_OPERATION_TYPE { |
| SamObjectChangeNotificationOperation = 0, |
| }} |
| pub type PSAM_GENERIC_OPERATION_TYPE = *mut SAM_GENERIC_OPERATION_TYPE; |
| STRUCT!{struct SAM_OPERATION_OBJCHG_INPUT { |
| Register: BOOLEAN, |
| EventHandle: ULONG64, |
| ObjectType: SECURITY_DB_OBJECT_TYPE, |
| ProcessID: ULONG, |
| }} |
| pub type PSAM_OPERATION_OBJCHG_INPUT = *mut SAM_OPERATION_OBJCHG_INPUT; |
| STRUCT!{struct SAM_OPERATION_OBJCHG_OUTPUT { |
| Reserved: ULONG, |
| }} |
| pub type PSAM_OPERATION_OBJCHG_OUTPUT = *mut SAM_OPERATION_OBJCHG_OUTPUT; |
| UNION!{union SAM_GENERIC_OPERATION_INPUT { |
| ObjChangeIn: SAM_OPERATION_OBJCHG_INPUT, |
| }} |
| pub type PSAM_GENERIC_OPERATION_INPUT = *mut SAM_GENERIC_OPERATION_INPUT; |
| UNION!{union SAM_GENERIC_OPERATION_OUTPUT { |
| ObjChangeOut: SAM_OPERATION_OBJCHG_OUTPUT, |
| }} |
| pub type PSAM_GENERIC_OPERATION_OUTPUT = *mut SAM_GENERIC_OPERATION_OUTPUT; |
| EXTERN!{extern "system" { |
| fn SamPerformGenericOperation( |
| ServerName: PWSTR, |
| OperationType: SAM_GENERIC_OPERATION_TYPE, |
| OperationIn: PSAM_GENERIC_OPERATION_INPUT, |
| OperationOut: *mut PSAM_GENERIC_OPERATION_OUTPUT, |
| ) -> NTSTATUS; |
| }} |