4 samr interface definition
8 Thanks to Todd Sabin for some information from his samr.idl in acltools
11 [ uuid(12345778-1234-abcd-ef00-0123456789ac),
13 pointer_default(unique)
18 NTSTATUS samr_Connect (
19 /* notice the lack of [string] */
20 [in] uint16 *system_name,
21 [in] uint32 access_mask,
22 [out,ref] policy_handle *handle
29 [in,out,ref] policy_handle *handle
36 [value(ndr_size_security_descriptor(r->sd))] uint32 sd_size;
37 [subcontext(4)] security_descriptor *sd;
40 NTSTATUS samr_SetSecurity (
41 [in,ref] policy_handle *handle,
43 [in,ref] samr_SdBuf *sdbuf
49 NTSTATUS samr_QuerySecurity (
50 [in,ref] policy_handle *handle,
52 [out] samr_SdBuf *sdbuf
59 shutdown the SAM - once you call this the SAM will be dead
61 NTSTATUS samr_Shutdown (
62 [in,ref] policy_handle *handle
68 [value(2*strlen_m(r->name))] uint16 name_len;
69 [value(r->name_len)] uint16 name_size;
73 NTSTATUS samr_LookupDomain (
74 [in,ref] policy_handle *handle,
75 [in,ref] samr_Name *domain,
90 [size_is(count)] samr_SamEntry *entries;
93 NTSTATUS samr_EnumDomains (
94 [in,ref] policy_handle *handle,
95 [in,out,ref] uint32 *resume_handle,
97 [out] samr_SamArray *sam,
98 [out] uint32 num_entries
102 /************************/
104 NTSTATUS samr_OpenDomain(
105 [in,ref] policy_handle *handle,
106 [in] uint32 access_mask,
107 [in,ref] dom_sid2 *sid,
108 [out,ref] policy_handle *domain_handle
111 /************************/
115 uint16 min_length_password;
116 uint16 password_history;
119 NTTIME min_passwordage;
123 ULONG8 force_logoff_time;
125 samr_Name domain; /* domain name */
126 samr_Name primary; /* PDC name if this is a BDC */
127 HYPER_T sequence_num;
137 ULONG8 force_logoff_time;
141 /* I'm not entirely sure this is a comment. win2003
142 allows it to be set, and it seems harmless (like a
143 comment) but I haven't seen it show up anywhere */
160 HYPER_T sequence_num;
161 NTTIME last_xxx_time;
165 uint32 unknown; /* w2k3 returns 1 */
169 ULONG8 force_logoff_time;
173 HYPER_T sequence_num;
174 uint32 unknown2; /* w2k3 returns 1 */
176 uint32 unknown3; /* w2k3 returns 1 */
180 HYPER_T lockout_duration;
181 HYPER_T lockout_window;
182 uint16 lockout_threshold;
186 HYPER_T lockout_duration;
187 HYPER_T lockout_window;
188 uint16 lockout_threshold;
192 HYPER_T sequence_num;
193 NTTIME last_xxx_time;
199 [case(1)] samr_DomInfo1 info1;
200 [case(2)] samr_DomInfo2 info2;
201 [case(3)] samr_DomInfo3 info3;
202 [case(4)] samr_DomInfo4 info4;
203 [case(5)] samr_DomInfo5 info5;
204 [case(6)] samr_DomInfo6 info6;
205 [case(7)] samr_DomInfo7 info7;
206 [case(8)] samr_DomInfo8 info8;
207 [case(9)] samr_DomInfo9 info9;
208 [case(11)] samr_DomInfo11 info11;
209 [case(12)] samr_DomInfo12 info12;
210 [case(13)] samr_DomInfo13 info13;
213 NTSTATUS samr_QueryDomainInfo(
214 [in,ref] policy_handle *handle,
216 [out,switch_is(level)] samr_DomainInfo *info
219 /************************/
222 only levels 1, 3, 4, 6, 7, 9, 12 are valid for this
225 NTSTATUS samr_SetDomainInfo(
226 [in,ref] policy_handle *handle,
228 [in,switch_is(level),ref] samr_DomainInfo *info
232 /************************/
234 NTSTATUS samr_CreateDomainGroup(
235 [in,ref] policy_handle *handle,
236 [in,ref] samr_Name *name,
237 [in] uint32 access_mask,
238 [out,ref] policy_handle *group_handle,
239 [out,ref] uint32 *rid
243 /************************/
245 NTSTATUS samr_EnumDomainGroups(
246 [in,ref] policy_handle *handle,
247 [in,out,ref] uint32 *resume_handle,
248 [in] uint32 max_size,
249 [out] samr_SamArray *sam,
250 [out] uint32 num_entries
253 /************************/
255 NTSTATUS samr_CreateUser(
256 [in,ref] policy_handle *handle,
257 [in,ref] samr_Name *username,
258 [in] uint32 access_mask,
259 [out,ref] policy_handle *acct_handle,
260 [out,ref] uint32 *rid
263 /************************/
265 NTSTATUS samr_EnumDomainUsers(
266 [in,ref] policy_handle *handle,
267 [in,out,ref] uint32 *resume_handle,
268 [in] uint32 acct_flags,
269 [in] uint32 max_size,
270 [out] samr_SamArray *sam,
271 [out] uint32 num_entries
274 /************************/
276 NTSTATUS samr_CreateDomAlias(
277 [in,ref] policy_handle *handle,
278 [in,ref] samr_Name *aliasname,
279 [in] uint32 access_mask,
280 [out,ref] policy_handle *acct_handle,
281 [out,ref] uint32 *rid
284 /************************/
286 NTSTATUS samr_EnumDomainAliases(
287 [in,ref] policy_handle *handle,
288 [in,out,ref] uint32 *resume_handle,
289 [in] uint32 max_size,
290 [out] samr_SamArray *sam,
291 [out] uint32 num_entries
294 /************************/
299 [size_is(count)] uint32 *ids;
302 NTSTATUS samr_GetAliasMembership(
303 [in,ref] policy_handle *handle,
304 [in,ref] lsa_SidArray *sids,
308 /************************/
311 NTSTATUS samr_LookupNames(
312 [in,ref] policy_handle *handle,
313 [in] uint32 num_names,
314 [in,ref,size_is(1000),length_is(num_names)] samr_Name *names,
320 /************************/
325 [size_is(count)] samr_Name *names;
328 NTSTATUS samr_LookupRids(
329 [in,ref] policy_handle *handle,
330 [in] uint32 num_rids,
331 [in,ref,size_is(1000),length_is(num_rids)] uint32 *rids,
332 [out] samr_Names names,
336 /************************/
338 NTSTATUS samr_OpenGroup(
339 [in,ref] policy_handle *handle,
340 [in] uint32 access_mask,
342 [out,ref] policy_handle *acct_handle
346 /************************/
353 samr_Name description;
361 samr_Name description;
362 } samr_GroupInfoDesciption;
372 [case(GroupInfoAll)] samr_GroupInfoAll all;
373 [case(GroupInfoName)] samr_Name name;
374 [case(GroupInfoX)] samr_GroupInfoX unknown;
375 [case(GroupInfoDescription)] samr_Name description;
378 NTSTATUS samr_QueryGroupInfo(
379 [in,ref] policy_handle *handle,
381 [out,switch_is(level)] samr_GroupInfo *info
384 /************************/
386 NTSTATUS samr_SetGroupInfo(
387 [in,ref] policy_handle *handle,
389 [in,switch_is(level),ref] samr_GroupInfo *info
392 /************************/
394 NTSTATUS samr_AddGroupMember(
395 [in,ref] policy_handle *handle,
400 /************************/
402 NTSTATUS samr_DeleteDomainGroup(
403 [in,out,ref] policy_handle *handle
406 /************************/
408 NTSTATUS samr_DeleteGroupMember(
409 [in,ref] policy_handle *handle,
414 /************************/
417 this isn't really valid IDL, but it does work. I suspect
418 I need to do some more pidl work to get this really right
427 samr_intArray *unknown7;
430 NTSTATUS samr_QueryGroupMember(
431 [in,ref] policy_handle *handle,
433 [out] samr_ridArray rids
437 /************************/
441 win2003 seems to accept any data at all for the two integers
442 below, and doesn't seem to do anything with them that I can
443 see. Weird. I really expected the first integer to be a rid
444 and the second to be the attributes for that rid member.
446 NTSTATUS samr_SetMemberAttributesOfGroup(
447 [in,ref] policy_handle *handle,
448 [in] uint32 unknown1,
453 /************************/
455 NTSTATUS samr_OpenAlias (
456 [in,ref] policy_handle *handle,
457 [in] uint32 access_mask,
459 [out,ref] policy_handle *acct_handle
463 /************************/
469 samr_Name description;
473 [case(1)] samr_AliasInfoAll all;
474 [case(2)] samr_Name name;
475 [case(3)] samr_Name description;
478 NTSTATUS samr_QueryAliasInfo(
479 [in,ref] policy_handle *handle,
481 [out,switch_is(level)] samr_AliasInfo *info
484 /************************/
486 NTSTATUS samr_SetAliasInfo(
487 [in,ref] policy_handle *handle,
489 [in,switch_is(level)] samr_AliasInfo info
492 /************************/
494 NTSTATUS samr_DeleteDomAlias(
495 [in,out,ref] policy_handle *handle
498 /************************/
500 NTSTATUS samr_AddAliasMember(
501 [in,ref] policy_handle *handle,
502 [in,ref] dom_sid2 *sid
505 /************************/
507 NTSTATUS samr_DeleteAliasMember(
508 [in,ref] policy_handle *handle,
509 [in,ref] dom_sid2 *sid
512 /************************/
514 NTSTATUS samr_GetMembersInAlias(
515 [in,ref] policy_handle *handle,
516 [out,ref] lsa_SidArray *sids
519 /************************/
521 NTSTATUS samr_OpenUser(
522 [in,ref] policy_handle *handle,
523 [in] uint32 access_mask,
525 [out,ref] policy_handle *acct_handle
528 /************************/
530 NTSTATUS samr_DeleteUser(
531 [in,out,ref] policy_handle *handle
534 /************************/
540 samr_Name description;
546 samr_Name unknown; /* settable, but doesn't stick. probably obsolete */
556 samr_Name home_directory;
557 samr_Name home_drive;
558 samr_Name logon_script;
560 samr_Name workstations;
563 NTTIME last_pwd_change;
564 NTTIME allow_pwd_change;
565 NTTIME force_pwd_change;
566 samr_LogonHours logon_hours;
567 uint16 bad_pwd_count;
573 samr_LogonHours logon_hours;
581 samr_Name home_directory;
582 samr_Name home_drive;
583 samr_Name logon_script;
585 samr_Name description;
586 samr_Name workstations;
589 samr_LogonHours logon_hours;
590 uint16 bad_pwd_count;
592 NTTIME last_pwd_change;
616 samr_Name home_drive;
620 samr_Name logon_script;
628 samr_Name description;
632 samr_Name workstations;
650 NTTIME last_pwd_change;
652 NTTIME allow_pwd_change;
653 NTTIME force_pwd_change;
657 samr_Name home_drive;
658 samr_Name logon_script;
660 samr_Name description;
661 samr_Name workstations;
668 [size_is(buf_count)] uint8 *buffer;
672 uint32 fields_present;
673 samr_LogonHours logon_hours;
674 uint16 bad_pwd_count;
684 typedef [flag(NDR_PAHEX)] struct {
686 } samr_CryptPassword;
689 samr_CryptPassword password;
694 [case(1)] samr_UserInfo1 info1;
695 [case(2)] samr_UserInfo2 info2;
696 [case(3)] samr_UserInfo3 info3;
697 [case(4)] samr_UserInfo4 info4;
698 [case(5)] samr_UserInfo5 info5;
699 [case(6)] samr_UserInfo6 info6;
700 [case(7)] samr_UserInfo7 info7;
701 [case(8)] samr_UserInfo8 info8;
702 [case(9)] samr_UserInfo9 info9;
703 [case(10)] samr_UserInfo10 info10;
704 [case(11)] samr_UserInfo11 info11;
705 [case(12)] samr_UserInfo12 info12;
706 [case(13)] samr_UserInfo13 info13;
707 [case(14)] samr_UserInfo14 info14;
708 [case(16)] samr_UserInfo16 info16;
709 [case(17)] samr_UserInfo17 info17;
710 [case(20)] samr_UserInfo20 info20;
711 [case(21)] samr_UserInfo21 info21;
712 [case(24)] samr_UserInfo24 info24;
715 NTSTATUS samr_QueryUserInfo(
716 [in,ref] policy_handle *handle,
718 [out,switch_is(level)] samr_UserInfo *info
722 /************************/
724 NTSTATUS samr_SetUserInfo(
725 [in,ref] policy_handle *handle,
727 [in,ref,switch_is(level)] samr_UserInfo *info
730 /************************/
733 typedef [flag(NDR_PAHEX)] struct {
738 this is a password change interface that doesn't give
739 the server the plaintext password. Depricated.
741 NTSTATUS samr_ChangePasswordUser(
742 [in,ref] policy_handle *handle,
743 [in] bool8 lm_present,
744 [in] samr_Hash *old_lm_crypted,
745 [in] samr_Hash *new_lm_crypted,
746 [in] bool8 nt_present,
747 [in] samr_Hash *old_nt_crypted,
748 [in] samr_Hash *new_nt_crypted,
749 [in] bool8 cross1_present,
750 [in] samr_Hash *nt_cross,
751 [in] bool8 cross2_present,
752 [in] samr_Hash *lm_cross
755 /************************/
765 [size_is(count)] samr_RidType *rid;
768 NTSTATUS samr_GetGroupsForUser(
769 [in,ref] policy_handle *handle,
770 [out] samr_RidArray *rids
773 /************************/
780 samr_Name account_name;
782 samr_Name description;
783 } samr_DispEntryGeneral;
787 [size_is(count)] samr_DispEntryGeneral *entries;
788 } samr_DispInfoGeneral;
794 samr_Name account_name;
795 samr_Name description;
796 } samr_DispEntryFull;
800 [size_is(count)] samr_DispEntryFull *entries;
804 [value(strlen_m(r->name))] uint16 name_len;
805 [value(strlen_m(r->name))] uint16 name_size;
811 samr_AsciiName account_name;
812 } samr_DispEntryAscii;
816 [size_is(count)] samr_DispEntryAscii *entries;
817 } samr_DispInfoAscii;
820 [case(1)] samr_DispInfoGeneral info1;/* users */
821 [case(2)] samr_DispInfoFull info2; /* trust accounts? */
822 [case(3)] samr_DispInfoFull info3; /* groups */
823 [case(4)] samr_DispInfoAscii info4; /* users */
824 [case(5)] samr_DispInfoAscii info5; /* groups */
827 NTSTATUS samr_QueryDisplayInfo(
828 [in,ref] policy_handle *handle,
830 [in] uint32 start_idx,
831 [in] uint32 max_entries,
832 [in] uint32 buf_size,
833 [out] uint32 total_size,
834 [out] uint32 returned_size,
835 [out,switch_is(level)] samr_DispInfo info
839 /************************/
843 this seems to be an alphabetic search function. The returned index
844 is the index for samr_QueryDisplayInfo needed to get names occurring
845 after the specified name. The supplied name does not need to exist
846 in the database (for example you can supply just a first letter for
847 searching starting at that letter)
849 The level corresponds to the samr_QueryDisplayInfo level
851 NTSTATUS samr_GetDisplayEnumerationIndex(
852 [in,ref] policy_handle *handle,
860 /************************/
864 w2k3 returns NT_STATUS_NOT_IMPLEMENTED for this
866 NTSTATUS samr_TestPrivateFunctionsDomain(
867 [in,ref] policy_handle *handle
871 /************************/
875 w2k3 returns NT_STATUS_NOT_IMPLEMENTED for this
877 NTSTATUS samr_TestPrivateFunctionsUser(
878 [in,ref] policy_handle *handle
882 /************************/
885 /* password properties flags */
886 const uint32 DOMAIN_PASSWORD_COMPLEX = 0x00000001;
887 const uint32 DOMAIN_PASSWORD_NO_ANON_CHANGE = 0x00000002;
888 const uint32 DOMAIN_PASSWORD_NO_CLEAR_CHANGE = 0x00000004;
889 const uint32 DOMAIN_PASSWORD_STORE_CLEARTEXT = 0x00000010;
890 const uint32 DOMAIN_REFUSE_PASSWORD_CHANGE = 0x00000020;
894 uint32 password_properties;
897 NTSTATUS samr_GetUserPwInfo(
898 [in,ref] policy_handle *handle,
899 [out] samr_PwInfo info
902 /************************/
904 NTSTATUS samr_RemoveMemberFromForeignDomain(
905 [in,ref] policy_handle *handle,
906 [in,ref] dom_sid2 *sid
909 /************************/
913 how is this different from QueryDomainInfo ??
915 NTSTATUS samr_QueryDomainInfo2(
916 [in,ref] policy_handle *handle,
918 [out,switch_is(level)] samr_DomainInfo *info
921 /************************/
925 how is this different from QueryUserInfo ??
927 NTSTATUS samr_QueryUserInfo2(
928 [in,ref] policy_handle *handle,
930 [out,switch_is(level)] samr_UserInfo *info
933 /************************/
937 how is this different from QueryDisplayInfo??
939 NTSTATUS samr_QueryDisplayInfo2(
940 [in,ref] policy_handle *handle,
942 [in] uint32 start_idx,
943 [in] uint32 max_entries,
944 [in] uint32 buf_size,
945 [out] uint32 total_size,
946 [out] uint32 returned_size,
947 [out,switch_is(level)] samr_DispInfo info
950 /************************/
954 how is this different from GetDisplayEnumerationIndex ??
956 NTSTATUS samr_GetDisplayEnumerationIndex2(
957 [in,ref] policy_handle *handle,
964 /************************/
966 NTSTATUS samr_CreateUser2(
967 /************************/
968 [in,ref] policy_handle *handle,
969 [in,ref] samr_Name *username,
970 [in] uint32 acct_flags,
971 [in] uint32 access_mask,
972 [out,ref] policy_handle *acct_handle,
973 [out,ref] uint32 *access_granted,
974 [out,ref] uint32 *rid
978 /************************/
982 another duplicate. There must be a reason ....
984 NTSTATUS samr_QueryDisplayInfo3(
985 [in,ref] policy_handle *handle,
987 [in] uint32 start_idx,
988 [in] uint32 max_entries,
989 [in] uint32 buf_size,
990 [out] uint32 total_size,
991 [out] uint32 returned_size,
992 [out,switch_is(level)] samr_DispInfo info
995 /************************/
997 NTSTATUS samr_AddMultipleMembersToAlias(
998 [in,ref] policy_handle *handle,
999 [in,ref] lsa_SidArray *sids
1002 /************************/
1004 NTSTATUS samr_RemoveMultipleMembersFromAlias(
1005 [in,ref] policy_handle *handle,
1006 [in,ref] lsa_SidArray *sids
1009 /************************/
1012 NTSTATUS samr_OemChangePasswordUser2(
1013 [in] samr_AsciiName *server,
1014 [in,ref] samr_AsciiName *account,
1015 [in] samr_CryptPassword *password,
1016 [in] samr_Hash *hash
1019 /************************/
1021 NTSTATUS samr_ChangePasswordUser2(
1022 [in] samr_Name *server,
1023 [in,ref] samr_Name *account,
1024 [in] samr_CryptPassword *nt_password,
1025 [in] samr_Hash *nt_verifier,
1026 [in] bool8 lm_change,
1027 [in] samr_CryptPassword *lm_password,
1028 [in] samr_Hash *lm_verifier
1031 /************************/
1033 NTSTATUS samr_GetDomPwInfo(
1034 [in] samr_Name *name,
1035 [out] samr_PwInfo info
1038 /************************/
1040 NTSTATUS samr_Connect2(
1041 [in] unistr *system_name,
1042 [in] uint32 access_mask,
1043 [out,ref] policy_handle *handle
1046 /************************/
1049 seems to be an exact alias for samr_SetUserInfo()
1051 NTSTATUS samr_SetUserInfo2(
1052 [in,ref] policy_handle *handle,
1054 [in,ref,switch_is(level)] samr_UserInfo *info
1057 /************************/
1060 this one is mysterious. I have a few guesses, but nothing working yet
1062 NTSTATUS samr_SetBootKeyInformation(
1063 [in,ref] policy_handle *handle,
1064 [in] uint32 unknown1,
1065 [in] uint32 unknown2,
1066 [in] uint32 unknown3
1069 /************************/
1071 NTSTATUS samr_GetBootKeyInformation(
1072 [in,ref] policy_handle *handle,
1073 [out] uint32 unknown
1076 /************************/
1078 NTSTATUS samr_Connect3(
1079 [in] unistr *system_name,
1080 [in] uint32 unknown,
1081 [in] uint32 access_mask,
1082 [out,ref] policy_handle *handle
1085 /************************/
1087 NTSTATUS samr_Connect4(
1088 [in] unistr *system_name,
1089 [in] uint32 unknown,
1090 [in] uint32 access_mask,
1091 [out,ref] policy_handle *handle
1094 /************************/
1096 NTSTATUS samr_ChangePasswordUser3(
1097 [in] samr_Name *server,
1098 [in,ref] samr_Name *account,
1099 [in] samr_CryptPassword *nt_password,
1100 [in] samr_Hash *nt_verifier,
1101 [in] bool8 lm_change,
1102 [in] samr_CryptPassword *lm_password,
1103 [in] samr_Hash *lm_verifier,
1104 [in] samr_CryptPassword *password3,
1105 [out] uint32 unknown1,
1106 [out] uint32 unknown2
1109 /************************/
1111 NTSTATUS samr_Connect5(
1112 [in] unistr *system_name,
1113 [in] uint32 access_mask,
1114 [in] uint32 unknown0,
1115 [in] uint32 unknown1,
1116 [in] uint32 unknown2,
1117 [in] uint32 unknown3,
1118 [out] uint32 unknown4,
1119 [out] uint32 unknown5,
1120 [out] uint32 unknown6,
1121 [out] uint32 unknown7,
1122 [out,ref] policy_handle *handle
1125 /************************/
1127 NTSTATUS samr_RidToSid(
1128 [in,ref] policy_handle *handle,
1134 /************************/
1138 this should set the DSRM password for the server, which is used
1139 when booting into Directory Services Recovery Mode on a DC. Win2003
1140 gives me NT_STATUS_NOT_SUPPORTED
1143 NTSTATUS samr_SetDsrmPassword(
1144 [in] samr_Name *name,
1145 [in] uint32 unknown,
1146 [in] samr_Hash *hash
1150 /************************/
1153 I haven't been able to work out the format of this one yet.
1154 Seems to start with a switch level for a union?
1156 NTSTATUS samr_ValidatePassword();