/* netlogon interface much of this was derived from the ethereal sources - thanks to everyone who contributed! */ #include "idl_types.h" [ uuid(12345678-1234-abcd-ef00-01234567cffb), version(1.0), pointer_default(unique) ] interface netlogon { /*****************/ /* Function 0x00 */ typedef struct { unistr *effective_name; uint32 priv; uint32 auth_flags; uint32 logon_count; uint32 bad_pw_count; time_t last_logon; time_t last_logoff; time_t logoff_time; time_t kickoff_time; uint32 password_age; time_t pw_can_change; time_t pw_must_change; unistr *computer; unistr *domain; unistr *script_path; uint32 unknown; } netr_UasInfo; WERROR netr_LogonUasLogon( [in] unistr *server_name, [in] unistr username, [in] unistr workstation, [out] netr_UasInfo *info ); /*****************/ /* Function 0x01 */ typedef struct { uint32 duration; uint16 logon_count; } netr_UasLogoffInfo; WERROR netr_LogonUasLogoff( [in] unistr *server_name, [in] unistr username, [in] unistr workstation, [out] netr_UasLogoffInfo info ); /*****************/ /* Function 0x02 */ typedef struct { uint16 size; uint16 length; unistr *string; } netr_String; typedef struct { netr_String LogonDomainName; uint32 ParameterControl; HYPER_T LogonID; netr_String username; netr_String workstation; } LOGON_IDENTITY_INFO; typedef struct { uint8 password[16]; } LM_OWF_PASSWORD; typedef struct { uint8 password[16]; } NT_OWF_PASSWORD; typedef struct { LOGON_IDENTITY_INFO identity_info; LM_OWF_PASSWORD lmpassword; NT_OWF_PASSWORD ntpassword; } INTERACTIVE_INFO; typedef [flag(NDR_PAHEX)] struct { uint8 data[8]; } netr_Credential; typedef struct { LOGON_IDENTITY_INFO logon_info; netr_Credential challenge; unistr ntchallengeresponse; unistr lmchallengeresponse; } NETWORK_INFO; typedef struct { LOGON_IDENTITY_INFO logon_info; LM_OWF_PASSWORD lmpassword; NT_OWF_PASSWORD ntpassword; } SERVICE_INFO; typedef union { [case(1)] INTERACTIVE_INFO *iinfo; [case(2)] NETWORK_INFO *ninfo; [case(3)] SERVICE_INFO *sinfo; } netr_LogonLevel; typedef struct { netr_Credential cred; time_t timestamp; } netr_Authenticator; typedef struct { uint32 user_id; uint32 attributes; } GROUP_MEMBERSHIP; typedef struct { uint8 user_session_key[16]; } USER_SESSION_KEY; typedef struct { NTTIME LogonTime; NTTIME LogoffTime; NTTIME KickOffTime; NTTIME PasswdLastSet; NTTIME PasswdCanChange; NTTIME PasswdMustChange; netr_String effectivename; netr_String fullname; netr_String logonscript; netr_String profilepath; netr_String homedirectory; netr_String homedirectorydrive; uint16 LogonCount; uint16 BadPasswdCount; uint32 userid; uint32 primarygroup; uint32 groupcount; [size_is(groupcount)] GROUP_MEMBERSHIP *groupids; uint32 userflags; USER_SESSION_KEY key; netr_String logonserver; netr_String domainname; dom_sid2 logondomainid; uint32 expansionroom[10]; } VALIDATION_SAM_INFO; typedef struct { NTTIME LogonTime; NTTIME LogoffTime; NTTIME KickOffTime; NTTIME PasswdLastSet; NTTIME PasswdCanChange; NTTIME PasswdMustChange; netr_String effectivename; netr_String fullname; netr_String logonscript; netr_String profilepath; netr_String homedirectory; netr_String homedirectorydrive; uint16 LogonCount; uint16 BadPasswdCount; uint32 userid; uint32 primarygroup; uint32 groupcount; GROUP_MEMBERSHIP *groupids; uint32 userflags; USER_SESSION_KEY key; netr_String logonserver; netr_String domainname; dom_sid2 logondomainid; uint32 expansionroom[10]; uint32 sidcount; dom_sid2 sid; uint32 sid_attribs; } VALIDATION_SAM_INFO2; typedef struct { uint32 pac_size; [size_is(pac_size)] uint8 *pac; netr_String logondomain; netr_String logonserver; netr_String principalname; uint32 auth_size; [size_is(auth_size)] uint8 *auth; USER_SESSION_KEY user_session_key; uint32 expansionroom[10]; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; } VALIDATION_PAC_INFO; typedef union { [case(2)] VALIDATION_SAM_INFO *sam; [case(3)] VALIDATION_SAM_INFO2 *sam2; [case(4)] VALIDATION_PAC_INFO *pac; [case(5)] VALIDATION_PAC_INFO *pac2; } netr_Validation; WERROR netr_LogonSamLogon( [in] unistr *server_name, [in] unistr *workstation, [in] netr_Authenticator *credential, [in][out] netr_Authenticator *authenticator, [in] uint16 logon_level, [in] [switch_is(logon_level)] netr_LogonLevel logon, [in] uint16 validation_level, [out] [switch_is(validation_level)] netr_Validation validation, [out] uint32 authoritative ); WERROR netr_LogonSamLogoff( [in] unistr *server_name, [in] unistr *computer_name, [in] netr_Authenticator credential, [in] netr_Authenticator return_authenticator, [in] uint16 logon_level, [in] [switch_is(logon_level)] netr_LogonLevel logon ); WERROR netr_ServerReqChallenge( [in] unistr *server_name, [in] unistr computer_name, [in][out][ref] netr_Credential *credential ); WERROR netr_ServerAuthenticate( [in] unistr *server_name, [in] unistr username, [in] uint16 secure_challenge_type, [in] unistr computer_name, [in,out,ref] netr_Credential *client_challenge ); #if 0 typedef struct { uint8 encrypted_password[16]; } ENCRYPTED_LM_OWF_PASSWORD; WERROR netr_ServerPasswordSet( [in] unistr *server_name, [in] unistr username, [in] uint16 secure_challenge_type, [in] unistr ComputerName, [in][ref] AUTHENTICATOR credential, [in][ref] LM_OWF_PASSWORD UasNewPassword, [out][ref] AUTHENTICATOR return_authenticator ); typedef struct { unistr *username; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_DELETE_USER; typedef struct { bool SensitiveDataFlag; uint32 DataLength; [size_is(DataLength)] uint8 *SensitiveData; } USER_PRIVATE_INFO; typedef struct { netr_String username; netr_String FullName; uint32 UserID; uint32 PrimaryGroupID; netr_String HomeDir; netr_String HomeDirDrive; netr_String LogonScript; netr_String Comment; netr_String workstations; NTTIME LastLogon; NTTIME LastLogoff; LOGON_HOURS logonhours; uint16 BadPwCount; uint16 LogonCount; NTTIME PwLastSet; NTTIME AccountExpires; uint32 AccountControl; LM_OWF_PASSWORD lmpw; NT_OWF_PASSWORD ntpw; bool NTPwPresent; bool LMPwPresent; bool PwExpired; netr_String UserComment; netr_String Parameters; uint16 CountryCode; uint16 CodePage; USER_PRIVATE_INFO user_private_info; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_USER; typedef struct { netr_String DomainName; netr_String OEMInfo; NTTIME forcedlogoff; uint16 minpasswdlen; uint16 passwdhistorylen; NTTIME pwd_must_change_time; NTTIME pwd_can_change_time; NTTIME domain_modify_time; NTTIME domain_create_time; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_DOMAIN; typedef struct { netr_String groupname; GROUP_MEMBERSHIP group_membership; netr_String comment; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_GROUP; typedef struct { netr_String OldName; netr_String NewName; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_RENAME; typedef struct { [size_is(num_rids)] uint32 *rids; [size_is(num_rids)] uint32 *attribs; uint32 num_rids; uint32 dummy1; uint32 dummy2; uint32 dummy3; uint32 dummy4; } DELTA_GROUP_MEMBER; typedef struct { netr_String alias_name; uint32 rid; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_ALIAS; typedef struct { SID_ARRAY sids; uint32 dummy1; uint32 dummy2; uint32 dummy3; uint32 dummy4; } DELTA_ALIAS_MEMBER; typedef struct { uint32 pagedpoollimit; uint32 nonpagedpoollimit; uint32 minimumworkingsetsize; uint32 maximumworkingsetsize; uint32 pagefilelimit; NTTIME timelimit; } QUOTA_LIMITS; typedef struct { uint32 maxlogsize; NTTIME auditretentionperiod; bool auditingmode; uint32 maxauditeventcount; [size_is(maxauditeventcount)] uint32 *eventauditoptions; netr_String primarydomainname; dom_sid2 *sid; QUOTA_LIMITS quota_limits; NTTIME db_modify_time; NTTIME db_create_time; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_POLICY; typedef struct { netr_String DomainName; uint32 num_controllers; [size_is(num_controllers)] netr_String *controller_names; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_TRUSTED_DOMAINS; typedef struct { uint32 privilegeentries; uint32 provolegecontrol; [size_is(privilege_entries)] uint32 *privilege_attrib; [size_is(privilege_entries)] netr_String *privilege_name; QUOTALIMITS quotalimits; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_ACCOUNTS; typedef struct { uint32 len; uint32 maxlen; [size_is(maxlen)][length_is(len)] uint8 *cipher_data; } CIPHER_VALUE; typedef struct { CIPHER_VALUE current_cipher; NTTIME current_cipher_set_time; CIPHER_VALUE old_cipher; NTTIME old_cipher_set_time; uint32 SecurityInformation; LSA_SECURITY_DESCRIPTOR sec_desc; netr_String dummy1; netr_String dummy2; netr_String dummy3; netr_String dummy4; uint32 dummy5; uint32 dummy6; uint32 dummy7; uint32 dummy8; } DELTA_SECRET; typedef struct { uint32 low_value; uint32 high_value; } xxx; typedef [switch_type(short)] union { [case(1)] DELTA_DOMAIN *domain; [case(2)] DELTA_GROUP *group; [case(4)] DELTA_RENAME_GROUP *rename_group; [case(5)] DELTA_USER *user; [case(7)] DELTA_RENAME_USER *rename_user; [case(8)] DELTA_GROUP_MEMBER *group_member; [case(9)] DELTA_ALIAS *alias; [case(11)] DELTA_RENAME_ALIAS *rename_alias; [case(12)] DELTA_ALIAS_MEMBER *alias_member; [case(13)] DELTA_POLICY *policy; [case(14)] DELTA_TRUSTED_DOMAINS *trusted_domains; [case(16)] DELTA_ACCOUNTS *accounts; [case(18)] DELTA_SECRET *secret; [case(20)] DELTA_DELETE_USER *delete_group; [case(21)] DELTA_DELETE_USER *delete_user; [case(22)] MODIFIED_COUNT *modified_count; } DELTA_UNION; typedef [switch_type(short)] union { [case(1)] uint32 rid; [case(2)] uint32 rid; [case(3)] uint32 rid; [case(4)] uint32 rid; [case(5)] uint32 rid; [case(6)] uint32 rid; [case(7)] uint32 rid; [case(8)] uint32 rid; [case(9)] uint32 rid; [case(10)] uint32 rid; [case(11)] uint32 rid; [case(12)] uint32 rid; [case(13)] dom_sid2 *sid; [case(14)] dom_sid2 *sid; [case(15)] dom_sid2 *sid; [case(16)] dom_sid2 *sid; [case(17)] dom_sid2 *sid; [case(18)] unistr *Name ; [case(19)] unistr *Name ; [case(20)] uint32 rid; [case(21)] uint32 rid; } DELTA_ID_UNION; typedef struct { uint16 delta_type; DELTA_ID_UNION delta_id_union; DELTA_UNION delta_union; } DELTA_ENUM; typedef struct { uint32 num_deltas; [size_is(num_deltas)] DELTA_ENUM *delta_enum; } DELTA_ENUM_ARRAY; WERROR netr_DatabaseDeltas( [in][string][ref] wchar_t *logonserver, # REF!!! [in][string][ref] wchar_t *computername, [in][ref] AUTHENTICATOR credential, [in][out][ref] AUTHENTICATOR return_authenticator, [in] uint32 database_id, [in][out][ref] MODIFIED_COUNT domain_modify_count, [in] uint32 preferredmaximumlength, [out] DELTA_ENUM_ARRAY *delta_enum_array ); WERROR netr_DatabaseSync( [in][string][ref] wchar_t *logonserver, # REF!!! [in][string][ref] wchar_t *computername, [in][ref] AUTHENTICATOR credential, [in][out][ref] AUTHENTICATOR return_authenticator, [in] uint32 database_id, [in][out][ref] uint32 sync_context, [in] uint32 preferredmaximumlength, [out] DELTA_ENUM_ARRAY *delta_enum_array ); typedef struct { uint8 computer_name[16]; uint32 timecreated; uint32 serial_number; } UAS_INFO_0; WERROR netr_AccountDeltas( [in][string] wchar_t *logonserver, [in][string][ref] wchar_t *computername, [in][ref] AUTHENTICATOR credential, [in][out][ref] AUTHENTICATOR return_authenticator, [out][ref][size_is(count_returned)] uint8 *Buffer, [out][ref] uint32 count_returned, [out][ref] uint32 total_entries, [in][out][ref] UAS_INFO_0 recordid, [in][long] count, [in][long] level, [in][long] buffersize, ); WERROR netr_AccountSync( [in][string] wchar_t *logonserver, [in][string][ref] wchar_t *computername, [in][ref] AUTHENTICATOR credential, [in][out][ref] AUTHENTICATOR return_authenticator, [out][ref][size_is(count_returned)] uint8 *Buffer, [out][ref] uint32 count_returned, [out][ref] uint32 total_entries, [out][ref] uint32 next_reference, [in][long] reference, [in][long] level, [in][long] buffersize, [in][out][ref] UAS_INFO_0 recordid, ); WERROR netr_GetDcName( [in] unistr logon_server, [in] unistr *domainname, [out]unistr *dcname, }; typedef struct { uint32 flags; uint32 pdc_connection_status; } NETLOGON_INFO_1; typedef struct { uint32 flags; uint32 pdc_connection_status; unistrtrusted_dc_name; uint32 tc_connection_status; } NETLOGON_INFO_2; typedef struct { uint32 flags; uint32 logon_attempts; uint32 reserved; uint32 reserved; uint32 reserved; uint32 reserved; uint32 reserved; } NETLOGON_INFO_3; typedef [switch_type(long)] union { [case(1)] NETLOGON_INFO_1 *i1; [case(2)] NETLOGON_INFO_2 *i2; [case(3)] NETLOGON_INFO_3 *i3; } CONTROL_QUERY_INFORMATION; WERROR netr_LogonControl( [in][string] wchar_t *logonserver, [in] uint32 function_code, [in] uint32 level, [out][ref] CONTROL_QUERY_INFORMATION ); WERROR netr_GetAnyDCName( [in] unistr *logon_server, [in] unistr *domainname, [out]unistr *dcname, }; typedef [switch_type(long)] union { [case(5)] unistr *unknown; [case(6)] unistr *unknown; [case(0xfffe)] uint32 unknown; [case(7)] unistry*unknown; } CONTROL_DATA_INFORMATION; WERROR netr_LogonControl2( [in][string] wchar_t *logonserver, [in] uint32 function_code, [in] uint32 level, [in][ref] CONTROL_DATA_INFORMATION *data, [out][ref] CONTROL_QUERY_INFORMATION *query ); WERROR netr_ServerAuthenticate2( [in][string] wchar_t *logonserver, [in] unistr username, [in] uint16 secure_channel_type, [in] unistr computername, [in][ref] CREDENTIAL *client_chal, [out][ref] CREDENTIAL *server_chal, [in][out][ref] uint32 *negotiate_flags, ); WERROR netr_DatabaseSync2( [in][string][ref] wchar_t *logonserver, # REF!!! [in][string][ref] wchar_t *computername, [in][ref] AUTHENTICATOR credential, [in][out][ref] AUTHENTICATOR return_authenticator, [in] uint32 database_id, [in] uint16 restart_state, [in][out][ref] uint32 *sync_context, [in] uint32 preferredmaximumlength, [out] DELTA_ENUM_ARRAY *delta_enum_array ); WERROR netr_DatabaseRedo( [in][string][ref] wchar_t *logonserver, # REF!!! [in][string][ref] wchar_t *computername, [in][ref] AUTHENTICATOR credential, [in][out][ref] AUTHENTICATOR return_authenticator, [in][ref][size_is(change_log_entry_size)] uint8 *change_log_entry, [in] uint32 change_log_entry_size, [out] DELTA_ENUM_ARRAY *delta_enum_array ); WERROR netr_LogonControl2Ex( [in][string] wchar_t *logonserver, [in] uint32 function_code, [in] uint32 level, [in][ref] CONTROL_DATA_INFORMATION *data, [out][ref] CONTROL_QUERY_INFORMATION *query ); #endif }