From b0531a38cc7135538d251440ac4fc2c887d9f335 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 1 Dec 2003 01:41:38 +0000 Subject: started adding netlogon IDL and test suite (This used to be commit 3d64eefb464d09fb6e84d6139f801887a278cf86) --- source4/librpc/idl/netlogon.idl | 631 +++++++++++++++++++++++++++++++++++++++- source4/librpc/ndr/ndr_basic.c | 28 ++ 2 files changed, 656 insertions(+), 3 deletions(-) (limited to 'source4/librpc') diff --git a/source4/librpc/idl/netlogon.idl b/source4/librpc/idl/netlogon.idl index 049e6936ca..445f89d440 100644 --- a/source4/librpc/idl/netlogon.idl +++ b/source4/librpc/idl/netlogon.idl @@ -1,15 +1,640 @@ /* - plug and play services? + 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) ] + interface netlogon { - /*****************/ /* Function 0x00 */ - WERROR netlogon_Unknown0(); + 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 + ); + +#if 0 + typedef struct { + uint32 duration; + short logon_count; + } LOGOFF_UAS_INFO; + uint32 netr_LogonUasLogoff( + [in] unistr *ServerName, + [in][ref][string] wchar_t *UserName, + [in][ref][string] wchar_t *Workstation, + [out][ref] LOGOFF_UAS_INFO *info + ); + typedef struct { + UNICODESTRING LogonDomainName; + uint32 ParameterControl; + uint64 LogonID; + UNICODESTRING UserName; + UNICODESTRING Workstation; + } LOGON_IDENTITY_INFO; + typedef struct { + char password[16]; + } LM_OWF_PASSWORD; + typedef struct { + char password[16]; + } NT_OWF_PASSWORD; + typedef struct { + LOGON_IDENTITY_INFO identity_info; + LM_OWF_PASSWORD lmpassword; + NT_OWF_PASSWORD ntpassword; + } INTERACTIVE_INFO; + typedef struct { + char chl[8]; + } CHALLENGE; + typedef struct { + LOGON_IDENTITY_INFO logon_info; + CHALLENGE chal; + STRING ntchallengeresponse; + STRING lmchallengeresponse; + } NETWORK_INFO; + typedef struct { + LOGON_IDENTITY_INFO logon_info; + LM_OWF_PASSWORD lmpassword; + NT_OWF_PASSWORD ntpassword; + } SERVICE_INFO; + typedef [switch_type(short)] union { + [case(1)][unique] INTERACTIVE_INFO *iinfo; + [case(2)][unique] NETWORK_INFO *ninfo; + [case(3)][unique] SERVICE_INFO *sinfo; + } LEVEL; + typedef struct { + char cred[8]; + } CREDENTIAL; + typedef struct { + CREDENTIAL cred; + uint32 timestamp; + } AUTHENTICATOR; + typedef struct { + uint32 user_id; + uint32 attributes; + } GROUP_MEMBERSHIP; + typedef struct { + char user_session_key[16]; + } USER_SESSION_KEY; + typedef struct { + uint64 LogonTime; + uint64 LogoffTime; + uint64 KickOffTime; + uint64 PasswdLastSet; + uint64 PasswdCanChange; + uint64 PasswdMustChange; + unicodestring effectivename; + unicodestring fullname; + unicodestring logonscript; + unicodestring profilepath; + unicodestring homedirectory; + unicodestring homedirectorydrive; + short LogonCount; + short BadPasswdCount; + uint32 userid; + uint32 primarygroup; + uint32 groupcount; + [unique][size_is(groupcount)] GROUP_MEMBERSHIP *groupids; + uint32 userflags; + USER_SESSION_KEY key; + unicodestring logonserver; + unicodestring domainname; + [unique] SID logondomainid; + uint32 expansionroom[10]; + } VALIDATION_SAM_INFO; + typedef struct { + uint64 LogonTime; + uint64 LogoffTime; + uint64 KickOffTime; + uint64 PasswdLastSet; + uint64 PasswdCanChange; + uint64 PasswdMustChange; + unicodestring effectivename; + unicodestring fullname; + unicodestring logonscript; + unicodestring profilepath; + unicodestring homedirectory; + unicodestring homedirectorydrive; + short LogonCount; + short BadPasswdCount; + uint32 userid; + uint32 primarygroup; + uint32 groupcount; + [unique] GROUP_MEMBERSHIP *groupids; + uint32 userflags; + USER_SESSION_KEY key; + unicodestring logonserver; + unicodestring domainname; + [unique] SID logondomainid; + uint32 expansionroom[10]; + uint32 sidcount; + [unique] SID_AND_ATTRIBS; + } VALIDATION_SAM_INFO2; + typedef struct { + uint32 pac_size + [unique][size_is(pac_size)] char *pac; + UNICODESTRING logondomain; + UNICODESTRING logonserver; + UNICODESTRING principalname; + uint32 auth_size; + [unique][size_is(auth_size)] char *auth; + USER_SESSION_KEY user_session_key; + uint32 expansionroom[10]; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + } VALIDATION_PAC_INFO; + typedef [switch_type(short)] union { + [case(2)][unique] VALIDATION_SAM_INFO *sam; + [case(3)][unique] VALIDATION_SAM_INFO2 *sam2; + [case(4)][unique] VALIDATION_PAC_INFO *pac; + [case(5)][unique] VALIDATION_PAC_INFO *pac2; + } VALIDATION; + uint32 netr_LogonSamLogon( + [in] unistr *ServerName, + [in] unistr *Workstation, + [in][unique] AUTHENTICATOR *credential, + [in][out][unique] AUTHENTICATOR *returnauthenticator, + [in] short LogonLevel, + [in][ref] LOGON_LEVEL *logonlevel, + [in] short ValidationLevel, + [out][ref] VALIDATION *validation, + [out][ref] boolean Authorative + ); + uint32 netr_LogonSamLogoff( + [in] unistr *ServerName, + [in] unistr *ComputerName, + [in][unique] AUTHENTICATOR credential, + [in][unique] AUTHENTICATOR return_authenticator, + [in] short logon_level, + [in][ref] LEVEL logoninformation + ); + uint32 netr_ServerReqChallenge( + [in] unistr *ServerName, + [in][ref][string] wchar_t *ComputerName, + [in][ref] CREDENTIAL client_credential, + [out][ref] CREDENTIAL server_credential + ); + uint32 netr_ServerAuthenticate( + [in] unistr *ServerName, + [in][ref][string] wchar_t *UserName, + [in] short secure_challenge_type, + [in][ref][string] wchar_t *ComputerName, + [in][ref] CREDENTIAL client_challenge, + [out][ref] CREDENTIAL server_challenge + ); + typedef struct { + char encrypted_password[16]; + } ENCRYPTED_LM_OWF_PASSWORD; + uint32 netr_ServerPasswordSet( + [in] unistr *ServerName, + [in][ref][string] wchar_t *UserName, + [in] short secure_challenge_type, + [in][ref][string] wchar_t *ComputerName, + [in][ref] AUTHENTICATOR credential, + [in][ref] LM_OWF_PASSWORD UasNewPassword, + [out][ref] AUTHENTICATOR return_authenticator + ); + typedef struct { + unistr *UserName; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_DELETE_USER; + typedef struct { + bool SensitiveDataFlag; + uint32 DataLength; + [unique][size_is(DataLength)] char *SensitiveData; + } USER_PRIVATE_INFO; + typedef struct { + UNICODESTRING UserName; + UNICODESTRING FullName; + uint32 UserID; + uint32 PrimaryGroupID; + UNICODESTRING HomeDir; + UNICODESTRING HomeDirDrive; + UNICODESTRING LogonScript; + UNICODESTRING Comment; + UNICODESTRING Workstations; + NTTIME LastLogon; + NTTIME LastLogoff; + LOGON_HOURS logonhours; + short BadPwCount; + short LogonCount; + NTTIME PwLastSet; + NTTIME AccountExpires; + uint32 AccountControl; + LM_OWF_PASSWORD lmpw; + NT_OWF_PASSWORD ntpw; + bool NTPwPresent; + bool LMPwPresent; + bool PwExpired; + UNICODESTRING UserComment; + UNICODESTRING Parameters; + short CountryCode; + short CodePage; + USER_PRIVATE_INFO user_private_info; + uint32 SecurityInformation; + LSA_SECURITY_DESCRIPTOR sec_desc; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_USER; + typedef struct { + UNICODESTRING DomainName; + UNICODESTRING OEMInfo; + NTTIME forcedlogoff; + short minpasswdlen; + short 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; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_DOMAIN; + typedef struct { + UNICODESTRING groupname; + GROUP_MEMBERSHIP group_membership; + UNICODESTRING comment; + uint32 SecurityInformation; + LSA_SECURITY_DESCRIPTOR sec_desc; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_GROUP; + typedef struct { + UNICODESTRING OldName; + UNICODESTRING NewName; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_RENAME; + typedef struct { + [unique][size_is(num_rids)] uint32 *rids; + [unique][size_is(num_rids)] uint32 *attribs; + uint32 num_rids; + uint32 dummy1; + uint32 dummy2; + uint32 dummy3; + uint32 dummy4; + } DELTA_GROUP_MEMBER; + typedef struct { + UNICODESTRING alias_name; + uint32 rid; + uint32 SecurityInformation; + LSA_SECURITY_DESCRIPTOR sec_desc; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_ALIAS; + typedef struct { + [unique] 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; + [unique][size_is(maxauditeventcount)] uint32 *eventauditoptions; + UNICODESTRING primarydomainname; + [unique] SID *sid; + QUOTA_LIMITS quota_limits; + NTTIME db_modify_time; + NTTIME db_create_time; + uint32 SecurityInformation; + LSA_SECURITY_DESCRIPTOR sec_desc; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_POLICY; + typedef struct { + UNICODESTRING DomainName; + uint32 num_controllers; + [unique][size_is(num_controllers)] UNICODESTRING *controller_names; + uint32 SecurityInformation; + LSA_SECURITY_DESCRIPTOR sec_desc; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_TRUSTED_DOMAINS; + typedef struct { + uint32 privilegeentries; + uint32 provolegecontrol; + [unique][size_is(privilege_entries)] uint32 *privilege_attrib; + [unique][size_is(privilege_entries)] UNICODESTRING *privilege_name; + QUOTALIMITS quotalimits; + uint32 SecurityInformation; + LSA_SECURITY_DESCRIPTOR sec_desc; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING dummy4; + uint32 dummy5; + uint32 dummy6; + uint32 dummy7; + uint32 dummy8; + } DELTA_ACCOUNTS; + typedef struct { + uint32 len; + uint32 maxlen; + [unique][size_is(maxlen)][length_is(len)] char *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; + UNICODESTRING dummy1; + UNICODESTRING dummy2; + UNICODESTRING dummy3; + UNICODESTRING 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)][unique] DELTA_DOMAIN *domain; + [case(2)][unique] DELTA_GROUP *group; + [case(4)][unique] DELTA_RENAME_GROUP *rename_group; + [case(5)][unique] DELTA_USER *user; + [case(7)][unique] DELTA_RENAME_USER *rename_user; + [case(8)][unique] DELTA_GROUP_MEMBER *group_member; + [case(9)][unique] DELTA_ALIAS *alias; + [case(11)][unique] DELTA_RENAME_ALIAS *rename_alias; + [case(12)][unique] DELTA_ALIAS_MEMBER *alias_member; + [case(13)][unique] DELTA_POLICY *policy; + [case(14)][unique] DELTA_TRUSTED_DOMAINS *trusted_domains; + [case(16)][unique] DELTA_ACCOUNTS *accounts; + [case(18)][unique] DELTA_SECRET *secret; + [case(20)][unique] DELTA_DELETE_USER *delete_group; + [case(21)][unique] DELTA_DELETE_USER *delete_user; + [case(22)][unique] 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)] [unique] SID *sid; + [case(14)] [unique] SID *sid; + [case(15)] [unique] SID *sid; + [case(16)] [unique] SID *sid; + [case(17)] [unique] SID *sid; + [case(18)] unistr *Name ; + [case(19)] unistr *Name ; + [case(20)] uint32 rid; + [case(21)] uint32 rid; + } DELTA_ID_UNION; + typedef struct { + short delta_type; + DELTA_ID_UNION delta_id_union; + DELTA_UNION delta_union; + } DELTA_ENUM; + typedef struct { + uint32 num_deltas; + [unique][size_is(num_deltas)] DELTA_ENUM *delta_enum; + } DELTA_ENUM_ARRAY; + uint32 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][unique] DELTA_ENUM_ARRAY *delta_enum_array + ); + uint32 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][unique] DELTA_ENUM_ARRAY *delta_enum_array + ); + typedef struct { + char computer_name[16]; + uint32 timecreated; + uint32 serial_number; + } UAS_INFO_0; + uint32 netr_AccountDeltas( + [in][string][unique] 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)] char *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, + ); + uint32 netr_AccountSync( + [in][string][unique] 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)] char *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, + ); + uint32 netr_GetDcName( + [in][ref][string] wchar_t *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)] [unique] NETLOGON_INFO_1 *i1; + [case(2)] [unique] NETLOGON_INFO_2 *i2; + [case(3)] [unique] NETLOGON_INFO_3 *i3; + } CONTROL_QUERY_INFORMATION; + uint32 netr_LogonControl( + [in][string][unique] wchar_t *logonserver, + [in] uint32 function_code, + [in] uint32 level, + [out][ref] CONTROL_QUERY_INFORMATION + ); + uint32 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; + uint32 netr_LogonControl2( + [in][string][unique] wchar_t *logonserver, + [in] uint32 function_code, + [in] uint32 level, + [in][ref] CONTROL_DATA_INFORMATION *data, + [out][ref] CONTROL_QUERY_INFORMATION *query + ); + uint32 netr_ServerAuthenticate2( + [in][string][unique] wchar_t *logonserver, + [in][ref][string] wchar_t *username, + [in] short secure_channel_type, + [in][ref][string] wchar_t *computername, + [in][ref] CREDENTIAL *client_chal, + [out][ref] CREDENTIAL *server_chal, + [in][out][ref] uint32 *negotiate_flags, + ); + uint32 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] short restart_state, + [in][out][ref] uint32 *sync_context, + [in] uint32 preferredmaximumlength, + [out][unique] DELTA_ENUM_ARRAY *delta_enum_array + ); + uint32 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)] char *change_log_entry, + [in] uint32 change_log_entry_size, + [out][unique] DELTA_ENUM_ARRAY *delta_enum_array + ); + uint32 netr_LogonControl2Ex( + [in][string][unique] wchar_t *logonserver, + [in] uint32 function_code, + [in] uint32 level, + [in][ref] CONTROL_DATA_INFORMATION *data, + [out][ref] CONTROL_QUERY_INFORMATION *query + ); +#endif } diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c index 52f4d29428..32cc7bac5f 100644 --- a/source4/librpc/ndr/ndr_basic.c +++ b/source4/librpc/ndr/ndr_basic.c @@ -597,6 +597,25 @@ NTSTATUS ndr_pull_NTTIME(struct ndr_pull *ndr, NTTIME *t) return NT_STATUS_OK; } +/* + push a time_t +*/ +NTSTATUS ndr_push_time_t(struct ndr_push *ndr, time_t t) +{ + return ndr_push_uint32(ndr, t); +} + +/* + pull a time_t +*/ +NTSTATUS ndr_pull_time_t(struct ndr_pull *ndr, time_t *t) +{ + uint32 tt; + NDR_CHECK(ndr_pull_uint32(ndr, &tt)); + *t = tt; + return NT_STATUS_OK; +} + void ndr_print_struct(struct ndr_print *ndr, const char *name, const char *type) { @@ -646,6 +665,15 @@ void ndr_print_NTTIME(struct ndr_print *ndr, const char *name, NTTIME t) ndr->print(ndr, "%-25s: %s", name, nt_time_string(ndr->mem_ctx, &t)); } +void ndr_print_time_t(struct ndr_print *ndr, const char *name, time_t t) +{ + if (t == (time_t)-1 || t == 0) { + ndr->print(ndr, "%-25s: (time_t)%d", name, (int)t); + } else { + ndr->print(ndr, "%-25s: %s", name, http_timestring(ndr->mem_ctx, t)); + } +} + void ndr_print_union(struct ndr_print *ndr, const char *name, uint16 level, const char *type) { ndr->print(ndr, "%-25s: union %s(case %u)", name, type, level); -- cgit