/*++ Copyright (c) 1990 Microsoft Corporation Module Name: wkssvc.idl Abstract: Contains the Netr (Net Remote) RPC interface specification for the APIs associated with the Workstation service. This includes APIs from the following catagories: NetWksta NetUse Also contains the RPC specific data structures for these API. Author: Rita Wong (ritaw) 06-May-1991 Environment: User Mode - Win32 - MIDL Revision History: 21-Jan-1992 rfirth * Removed NET_API_FUNCTION from all interfaces --*/ // // Interface Attributes // [ uuid(6BFFD098-A112-3610-9833-46C3F87E345A), version(1.0), #ifdef __midl ms_union, #endif // __midl pointer_default(unique) ] // // Interface Keyword // interface wkssvc // // Interface Body // { import "imports.idl"; #include // // BUGBUG - take this definition out when midl understands LPWSTR etc // #ifdef UNICODE #define LPTSTR wchar_t* #endif // // ---------------------------------------------------------------// // typedef [handle] LPTSTR WKSSVC_IMPERSONATE_HANDLE; typedef [handle] LPTSTR WKSSVC_IDENTIFY_HANDLE; // // Workstation APIs // // // NetrWkstaGetInfo and NetrWkstaSetInfo // typedef [switch_type(unsigned long)] union _WKSTA_INFO { [case(100)] LPWKSTA_INFO_100 WkstaInfo100; [case(101)] LPWKSTA_INFO_101 WkstaInfo101; [case(102)] LPWKSTA_INFO_102 WkstaInfo102; [case(1010)] LPWKSTA_INFO_1010 WkstaInfo1010; [case(1011)] LPWKSTA_INFO_1011 WkstaInfo1011; [case(1012)] LPWKSTA_INFO_1012 WkstaInfo1012; [case(1013)] LPWKSTA_INFO_1013 WkstaInfo1013; [case(1018)] LPWKSTA_INFO_1018 WkstaInfo1018; [case(1023)] LPWKSTA_INFO_1023 WkstaInfo1023; [case(1033)] LPWKSTA_INFO_1033 WkstaInfo1033; [case(1041)] LPWKSTA_INFO_1041 WkstaInfo1041; [case(1042)] LPWKSTA_INFO_1042 WkstaInfo1042; [case(1043)] LPWKSTA_INFO_1043 WkstaInfo1043; [case(1044)] LPWKSTA_INFO_1044 WkstaInfo1044; [case(1045)] LPWKSTA_INFO_1045 WkstaInfo1045; [case(1046)] LPWKSTA_INFO_1046 WkstaInfo1046; [case(1047)] LPWKSTA_INFO_1047 WkstaInfo1047; [case(1048)] LPWKSTA_INFO_1048 WkstaInfo1048; [case(1049)] LPWKSTA_INFO_1049 WkstaInfo1049; [case(1050)] LPWKSTA_INFO_1050 WkstaInfo1050; [case(1051)] LPWKSTA_INFO_1051 WkstaInfo1051; [case(1052)] LPWKSTA_INFO_1052 WkstaInfo1052; [case(1053)] LPWKSTA_INFO_1053 WkstaInfo1053; [case(1054)] LPWKSTA_INFO_1054 WkstaInfo1054; [case(1055)] LPWKSTA_INFO_1055 WkstaInfo1055; [case(1056)] LPWKSTA_INFO_1056 WkstaInfo1056; [case(1057)] LPWKSTA_INFO_1057 WkstaInfo1057; [case(1058)] LPWKSTA_INFO_1058 WkstaInfo1058; [case(1059)] LPWKSTA_INFO_1059 WkstaInfo1059; [case(1060)] LPWKSTA_INFO_1060 WkstaInfo1060; [case(1061)] LPWKSTA_INFO_1061 WkstaInfo1061; [case(1062)] LPWKSTA_INFO_1062 WkstaInfo1062; [case(502)] LPWKSTA_INFO_502 WkstaInfo502; [default] ; } WKSTA_INFO, *PWKSTA_INFO, *LPWKSTA_INFO; NET_API_STATUS NetrWkstaGetInfo ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in] DWORD Level, [out, switch_is(Level)] LPWKSTA_INFO WkstaInfo ); NET_API_STATUS NetrWkstaSetInfo ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in] DWORD Level, [in, switch_is(Level)] LPWKSTA_INFO WkstaInfo, [in,out,unique] LPDWORD ErrorParameter ); // // NetrWkstaUserEnum // typedef struct _WKSTA_USER_INFO_0_CONTAINER { DWORD EntriesRead; [size_is(EntriesRead)] LPWKSTA_USER_INFO_0 Buffer; } WKSTA_USER_INFO_0_CONTAINER, *PWKSTA_USER_INFO_0_CONTAINER, *LPWKSTA_USER_INFO_0_CONTAINER; typedef struct _WKSTA_USER_INFO_1_CONTAINER { DWORD EntriesRead; [size_is(EntriesRead)] LPWKSTA_USER_INFO_1 Buffer; } WKSTA_USER_INFO_1_CONTAINER, *PWKSTA_USER_INFO_1_CONTAINER, *LPWKSTA_USER_INFO_1_CONTAINER; typedef struct _WKSTA_USER_ENUM_STRUCT { DWORD Level; [switch_is(Level)] union _WKSTA_USER_ENUM_UNION { [case(0)] LPWKSTA_USER_INFO_0_CONTAINER Level0; [case(1)] LPWKSTA_USER_INFO_1_CONTAINER Level1; [default] ; } WkstaUserInfo; } WKSTA_USER_ENUM_STRUCT, *PWKSTA_USER_ENUM_STRUCT, *LPWKSTA_USER_ENUM_STRUCT; NET_API_STATUS NetrWkstaUserEnum ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in,out] LPWKSTA_USER_ENUM_STRUCT UserInfo, [in] DWORD PreferredMaximumLength, [out] LPDWORD TotalEntries, [in,out,unique] LPDWORD ResumeHandle ); // // NetrWkstaUserGetInfo and NetrWkstaUserSetInfo // typedef [switch_type(unsigned long)] union _WKSTA_USER_INFO { [case(0)] LPWKSTA_USER_INFO_0 UserInfo0; [case(1)] LPWKSTA_USER_INFO_1 UserInfo1; [case(1101)] LPWKSTA_USER_INFO_1101 UserInfo1101; [default] ; } WKSTA_USER_INFO, *PWKSTA_USER_INFO, *LPWKSTA_USER_INFO; NET_API_STATUS NetrWkstaUserGetInfo ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE Reserved, [in] DWORD Level, [out, switch_is(Level)] LPWKSTA_USER_INFO UserInfo ); NET_API_STATUS NetrWkstaUserSetInfo ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE Reserved, [in] DWORD Level, [in, switch_is(Level)] LPWKSTA_USER_INFO UserInfo, [in,out,unique] LPDWORD ErrorParameter ); // // NetrWkstaTransportEnum // typedef struct _WKSTA_TRANSPORT_INFO_0_CONTAINER { DWORD EntriesRead; [size_is(EntriesRead)] LPWKSTA_TRANSPORT_INFO_0 Buffer; } WKSTA_TRANSPORT_INFO_0_CONTAINER, *PWKSTA_TRANSPORT_INFO_0_CONTAINER, *LPWKSTA_TRANSPORT_INFO_0_CONTAINER; typedef struct _WKSTA_TRANSPORT_ENUM_STRUCT { DWORD Level; [switch_is(Level)] union _WKSTA_TRANSPORT_ENUM_UNION { [case(0)] LPWKSTA_TRANSPORT_INFO_0_CONTAINER Level0; [default] ; } WkstaTransportInfo; } WKSTA_TRANSPORT_ENUM_STRUCT, *PWKSTA_TRANSPORT_ENUM_STRUCT, *LPWKSTA_TRANSPORT_ENUM_STRUCT; NET_API_STATUS NetrWkstaTransportEnum ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in,out] LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo, [in] DWORD PreferredMaximumLength, [out] LPDWORD TotalEntries, [in,out,unique] LPDWORD ResumeHandle ); // // NetrWkstaTransportAdd // NET_API_STATUS NetrWkstaTransportAdd ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in] DWORD Level, [in] LPWKSTA_TRANSPORT_INFO_0 TransportInfo, [in,out,unique] LPDWORD ErrorParameter ); // // NetrWkstaTransportDel // NET_API_STATUS NetrWkstaTransportDel ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in,string,unique] LPTSTR TransportName, [in] DWORD ForceLevel ); // // NetrUseAdd and NetrUseGetInfo // typedef [switch_type(unsigned long)] union _USE_INFO { [case(0)] LPUSE_INFO_0 UseInfo0; [case(1)] LPUSE_INFO_1 UseInfo1; [case(2)] LPUSE_INFO_2 UseInfo2; [case(3)] LPUSE_INFO_3 UseInfo3; [default] ; } USE_INFO, *PUSE_INFO, *LPUSE_INFO; NET_API_STATUS NetrUseAdd ( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in] DWORD Level, [in, switch_is(Level)] LPUSE_INFO InfoStruct, [in,out,unique] LPDWORD ErrorParameter ); NET_API_STATUS NetrUseGetInfo ( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string] LPTSTR UseName, [in] DWORD Level, [out, switch_is(Level)] LPUSE_INFO InfoStruct ); // // NetrUseDel // NET_API_STATUS NetrUseDel ( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string] LPTSTR UseName, [in] DWORD ForceLevel ); // // NetrUseEnum // typedef struct _USE_INFO_0_CONTAINER { DWORD EntriesRead; [size_is(EntriesRead)] LPUSE_INFO_0 Buffer; } USE_INFO_0_CONTAINER, *PUSE_INFO_0_CONTAINER, *LPUSE_INFO_0_CONTAINER; typedef struct _USE_INFO_1_CONTAINER { DWORD EntriesRead; [size_is(EntriesRead)] LPUSE_INFO_1 Buffer; } USE_INFO_1_CONTAINER, *PUSE_INFO_1_CONTAINER, *LPUSE_INFO_1_CONTAINER; typedef struct _USE_INFO_2_CONTAINER { DWORD EntriesRead; [size_is(EntriesRead)] LPUSE_INFO_2 Buffer; } USE_INFO_2_CONTAINER, *PUSE_INFO_2_CONTAINER, *LPUSE_INFO_2_CONTAINER; typedef struct _USE_ENUM_STRUCT { DWORD Level; [switch_is(Level)] union _USE_ENUM_UNION { [case(0)] LPUSE_INFO_0_CONTAINER Level0; [case(1)] LPUSE_INFO_1_CONTAINER Level1; [case(2)] LPUSE_INFO_2_CONTAINER Level2; [default] ; } UseInfo; }USE_ENUM_STRUCT, *PUSE_ENUM_STRUCT, *LPUSE_ENUM_STRUCT; NET_API_STATUS NetrUseEnum ( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in,out] LPUSE_ENUM_STRUCT InfoStruct, [in] DWORD PreferedMaximumLength, [out] LPDWORD TotalEntries, [in,out,unique] LPDWORD ResumeHandle ); // // NetrMessageBufferSend // NET_API_STATUS NetrMessageBufferSend ( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string] LPTSTR MessageName, [in,string,unique] LPTSTR FromName, [in,size_is(MessageSize)] LPBYTE Message, [in] DWORD MessageSize ); NET_API_STATUS NetrWorkstationStatisticsGet( [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName, [in,string,unique] LPTSTR ServiceName, [in] DWORD Level, [in] DWORD Options, [out] LPSTAT_WORKSTATION_0* Buffer ); // // I_NetrLogonDomainNameAdd // NET_API_STATUS I_NetrLogonDomainNameAdd( [in,string] WKSSVC_IDENTIFY_HANDLE LogonDomain ); // // I_NetrLogonDomainNameDel // NET_API_STATUS I_NetrLogonDomainNameDel( [in,string] WKSSVC_IDENTIFY_HANDLE LogonDomain ); // // Net join apis // NET_API_STATUS NetrJoinDomain( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string] LPTSTR DomainName, [in,string,unique] LPTSTR MachineAccountOU, [in,string,unique] LPTSTR AccountName, [in,string,unique] LPTSTR Password, [in] DWORD Options ); NET_API_STATUS NetrUnjoinDomain( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string,unique] LPTSTR AccountName, [in,string,unique] LPTSTR Password, [in] DWORD Options ); NET_API_STATUS NetrRenameMachineInDomain( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string,unique] LPTSTR MachineName, [in,string,unique] LPTSTR AccountName, [in,string,unique] LPTSTR Password, [in] DWORD Options ); // // Determine the validity of a name // NET_API_STATUS NetrValidateName( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string] LPTSTR NameToValidate, [in,string,unique] LPTSTR AccountName, [in,string,unique] LPTSTR Password, [in] NETSETUP_NAME_TYPE NameType ); // // Determines whether a workstation is joined to a domain or not // NET_API_STATUS NetrGetJoinInformation( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,out,string] LPTSTR *NameBuffer, [out] PNETSETUP_JOIN_STATUS BufferType ); typedef struct _NETSETUPR_MACHINE_ACCOUNT_OUS { [size_is( OUCount ), string ] LPWSTR *OUs; DWORD OUCount; } NETSETUPR_MACHINE_ACCOUNT_OUS, *PNETSETUPR_MACHINE_ACCOUNT_OUS, *LPNETSETUPR_MACHINE_ACCOUNT_OUS; typedef [string] LPWSTR OUSTRING; NET_API_STATUS NetrGetJoinableOUs( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in,string] LPWSTR Domain, [in,string,unique] LPWSTR Account, [in,string,unique] LPWSTR Password, [in,out] DWORD *OUCount, [out,size_is(,*OUCount)] OUSTRING **OUs ); // // Join APIs with encrypted passwords // // // Structure to pass an encrypted password over the wire. The Length is the // length of the password, which should be placed at the end of the buffer. // #define JOIN_OBFUSCATOR_LENGTH 8 #define JOIN_MAX_PASSWORD_LENGTH PWLEN typedef struct _JOINPR_USER_PASSWORD { UCHAR Obfuscator[JOIN_OBFUSCATOR_LENGTH]; WCHAR Buffer[JOIN_MAX_PASSWORD_LENGTH]; ULONG Length; } JOINPR_USER_PASSWORD, *PJOINPR_USER_PASSWORD; // // Buffer - contains random fill with the password filling up the end // of the buffer (the last Length bytes). // Length - Length, in bytes, of the buffer. // // // This is the encrypted version of the above structure, and is passed // on the wire. // typedef struct _JOINPR_ENCRYPTED_USER_PASSWORD { UCHAR Buffer[ JOIN_OBFUSCATOR_LENGTH + (JOIN_MAX_PASSWORD_LENGTH * sizeof(WCHAR)) + sizeof(ULONG) ]; } JOINPR_ENCRYPTED_USER_PASSWORD, *PJOINPR_ENCRYPTED_USER_PASSWORD; NET_API_STATUS NetrJoinDomain2( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string] LPTSTR DomainName, [in,string,unique] LPTSTR MachineAccountOU, [in,string,unique] LPTSTR AccountName, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password, [in] DWORD Options ); NET_API_STATUS NetrUnjoinDomain2( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string,unique] LPTSTR AccountName, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password, [in] DWORD Options ); NET_API_STATUS NetrRenameMachineInDomain2( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string,unique] LPTSTR MachineName, [in,string,unique] LPTSTR AccountName, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password, [in] DWORD Options ); NET_API_STATUS NetrValidateName2( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string] LPTSTR NameToValidate, [in,string,unique] LPTSTR AccountName, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password, [in] NETSETUP_NAME_TYPE NameType ); NET_API_STATUS NetrGetJoinableOUs2( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string] LPWSTR Domain, [in,string,unique] LPWSTR Account, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password, [in,out] DWORD *OUCount, [out,size_is(,*OUCount)] OUSTRING **OUs ); // // Computer rename preparation API // NET_API_STATUS NetrAddAlternateComputerName( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string,unique] LPTSTR AlternateName, [in,string,unique] LPTSTR DomainAccount, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, [in] DWORD Options ); NET_API_STATUS NetrRemoveAlternateComputerName( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string,unique] LPTSTR AlternateName, [in,string,unique] LPTSTR DomainAccount, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, [in] DWORD Options ); NET_API_STATUS NetrSetPrimaryComputerName( [in] handle_t RpcBindingHandle, [in,string,unique] LPTSTR ServerName, [in,string,unique] LPTSTR PrimaryName, [in,string,unique] LPTSTR DomainAccount, [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword, [in] DWORD Options ); typedef struct _NET_COMPUTER_NAME_ARRAY { ULONG EntryCount; [size_is(EntryCount)] PUNICODE_STRING ComputerNames; } NET_COMPUTER_NAME_ARRAY, *PNET_COMPUTER_NAME_ARRAY; NET_API_STATUS NetrEnumerateComputerNames( [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName, [in] NET_COMPUTER_NAME_TYPE NameType, [in] DWORD Options, [out] PNET_COMPUTER_NAME_ARRAY *ComputerNames ); }