2 * Unix SMB/CIFS implementation.
3 * RPC Pipe client / server routines
4 * Copyright (C) Andrew Tridgell 1992-1997,
5 * Copyright (C) Luke Kenneth Casson Leighton 1996-1997,
6 * Copyright (C) Paul Ashton 1997,
7 * Copyright (C) Jeremy Allison 2001, 2006.
8 * Copyright (C) Rafal Szczesniak 2002,
9 * Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2002,
10 * Copyright (C) Simo Sorce 2003.
11 * Copyright (C) Gerald (Jerry) Carter 2005.
12 * Copyright (C) Volker Lendecke 2005.
13 * Copyright (C) Guenther Deschner 2008.
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 3 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, see <http://www.gnu.org/licenses/>.
29 /* This is the implementation of the lsa server code. */
34 #define DBGC_CLASS DBGC_RPC_SRV
36 #define MAX_LOOKUP_SIDS 0x5000 /* 20480 */
45 const struct generic_mapping lsa_generic_mapping
= {
52 /***************************************************************************
53 init_lsa_ref_domain_list - adds a domain if it's not already in, returns the index.
54 ***************************************************************************/
56 static int init_lsa_ref_domain_list(TALLOC_CTX
*mem_ctx
,
57 struct lsa_RefDomainList
*ref
,
63 if (dom_name
!= NULL
) {
64 for (num
= 0; num
< ref
->count
; num
++) {
65 if (sid_equal(dom_sid
, ref
->domains
[num
].sid
)) {
73 if (num
>= LSA_REF_DOMAIN_LIST_MULTIPLIER
) {
74 /* index not found, already at maximum domain limit */
79 ref
->max_size
= LSA_REF_DOMAIN_LIST_MULTIPLIER
;
81 ref
->domains
= TALLOC_REALLOC_ARRAY(mem_ctx
, ref
->domains
,
82 struct lsa_DomainInfo
, ref
->count
);
87 ZERO_STRUCT(ref
->domains
[num
]);
89 init_lsa_StringLarge(&ref
->domains
[num
].name
, dom_name
);
90 ref
->domains
[num
].sid
= sid_dup_talloc(mem_ctx
, dom_sid
);
91 if (!ref
->domains
[num
].sid
) {
99 /***************************************************************************
100 initialize a lsa_DomainInfo structure.
101 ***************************************************************************/
103 static void init_dom_query_3(struct lsa_DomainInfo
*r
,
107 init_lsa_StringLarge(&r
->name
, name
);
111 /***************************************************************************
112 initialize a lsa_DomainInfo structure.
113 ***************************************************************************/
115 static void init_dom_query_5(struct lsa_DomainInfo
*r
,
119 init_lsa_StringLarge(&r
->name
, name
);
123 /***************************************************************************
124 lookup_lsa_rids. Must be called as root for lookup_name to work.
125 ***************************************************************************/
127 static NTSTATUS
lookup_lsa_rids(TALLOC_CTX
*mem_ctx
,
128 struct lsa_RefDomainList
*ref
,
129 struct lsa_TranslatedSid
*prid
,
130 uint32_t num_entries
,
131 struct lsa_String
*name
,
133 uint32_t *pmapped_count
)
135 uint32 mapped_count
, i
;
137 SMB_ASSERT(num_entries
<= MAX_LOOKUP_SIDS
);
142 for (i
= 0; i
< num_entries
; i
++) {
146 const char *full_name
;
148 enum lsa_SidType type
= SID_NAME_UNKNOWN
;
150 /* Split name into domain and user component */
152 full_name
= name
[i
].string
;
153 if (full_name
== NULL
) {
154 return NT_STATUS_NO_MEMORY
;
157 DEBUG(5, ("lookup_lsa_rids: looking up name %s\n", full_name
));
159 /* We can ignore the result of lookup_name, it will not touch
160 "type" if it's not successful */
162 lookup_name(mem_ctx
, full_name
, flags
, &domain
, NULL
,
167 case SID_NAME_DOM_GRP
:
168 case SID_NAME_DOMAIN
:
170 case SID_NAME_WKN_GRP
:
171 DEBUG(5, ("init_lsa_rids: %s found\n", full_name
));
172 /* Leave these unchanged */
175 /* Don't hand out anything but the list above */
176 DEBUG(5, ("init_lsa_rids: %s not found\n", full_name
));
177 type
= SID_NAME_UNKNOWN
;
184 if (type
!= SID_NAME_UNKNOWN
) {
185 sid_split_rid(&sid
, &rid
);
186 dom_idx
= init_lsa_ref_domain_list(mem_ctx
, ref
, domain
, &sid
);
190 prid
[i
].sid_type
= type
;
192 prid
[i
].sid_index
= dom_idx
;
195 *pmapped_count
= mapped_count
;
199 /***************************************************************************
200 lookup_lsa_sids. Must be called as root for lookup_name to work.
201 ***************************************************************************/
203 static NTSTATUS
lookup_lsa_sids(TALLOC_CTX
*mem_ctx
,
204 struct lsa_RefDomainList
*ref
,
205 struct lsa_TranslatedSid3
*trans_sids
,
206 uint32_t num_entries
,
207 struct lsa_String
*name
,
209 uint32
*pmapped_count
)
211 uint32 mapped_count
, i
;
213 SMB_ASSERT(num_entries
<= MAX_LOOKUP_SIDS
);
218 for (i
= 0; i
< num_entries
; i
++) {
222 const char *full_name
;
224 enum lsa_SidType type
= SID_NAME_UNKNOWN
;
228 /* Split name into domain and user component */
230 full_name
= name
[i
].string
;
231 if (full_name
== NULL
) {
232 return NT_STATUS_NO_MEMORY
;
235 DEBUG(5, ("init_lsa_sids: looking up name %s\n", full_name
));
237 /* We can ignore the result of lookup_name, it will not touch
238 "type" if it's not successful */
240 lookup_name(mem_ctx
, full_name
, flags
, &domain
, NULL
,
245 case SID_NAME_DOM_GRP
:
246 case SID_NAME_DOMAIN
:
248 case SID_NAME_WKN_GRP
:
249 DEBUG(5, ("init_lsa_sids: %s found\n", full_name
));
250 /* Leave these unchanged */
253 /* Don't hand out anything but the list above */
254 DEBUG(5, ("init_lsa_sids: %s not found\n", full_name
));
255 type
= SID_NAME_UNKNOWN
;
262 if (type
!= SID_NAME_UNKNOWN
) {
264 sid_copy(&domain_sid
, &sid
);
265 sid_split_rid(&domain_sid
, &rid
);
266 dom_idx
= init_lsa_ref_domain_list(mem_ctx
, ref
, domain
, &domain_sid
);
270 /* Initialize the lsa_TranslatedSid3 return. */
271 trans_sids
[i
].sid_type
= type
;
272 trans_sids
[i
].sid
= sid_dup_talloc(mem_ctx
, &sid
);
273 trans_sids
[i
].sid_index
= dom_idx
;
276 *pmapped_count
= mapped_count
;
280 static NTSTATUS
lsa_get_generic_sd(TALLOC_CTX
*mem_ctx
, SEC_DESC
**sd
, size_t *sd_size
)
282 DOM_SID local_adm_sid
;
289 init_sec_ace(&ace
[0], &global_sid_World
, SEC_ACE_TYPE_ACCESS_ALLOWED
, LSA_POLICY_EXECUTE
, 0);
291 sid_copy(&adm_sid
, get_global_sam_sid());
292 sid_append_rid(&adm_sid
, DOMAIN_GROUP_RID_ADMINS
);
293 init_sec_ace(&ace
[1], &adm_sid
, SEC_ACE_TYPE_ACCESS_ALLOWED
, LSA_POLICY_ALL_ACCESS
, 0);
295 sid_copy(&local_adm_sid
, &global_sid_Builtin
);
296 sid_append_rid(&local_adm_sid
, BUILTIN_ALIAS_RID_ADMINS
);
297 init_sec_ace(&ace
[2], &local_adm_sid
, SEC_ACE_TYPE_ACCESS_ALLOWED
, LSA_POLICY_ALL_ACCESS
, 0);
299 if((psa
= make_sec_acl(mem_ctx
, NT4_ACL_REVISION
, 3, ace
)) == NULL
)
300 return NT_STATUS_NO_MEMORY
;
302 if((*sd
= make_sec_desc(mem_ctx
, SECURITY_DESCRIPTOR_REVISION_1
,
303 SEC_DESC_SELF_RELATIVE
, &adm_sid
, NULL
, NULL
,
304 psa
, sd_size
)) == NULL
)
305 return NT_STATUS_NO_MEMORY
;
310 #if 0 /* AD DC work in ongoing in Samba 4 */
312 /***************************************************************************
314 ***************************************************************************/
316 static void init_dns_dom_info(LSA_DNS_DOM_INFO
*r_l
, const char *nb_name
,
317 const char *dns_name
, const char *forest_name
,
318 struct GUID
*dom_guid
, DOM_SID
*dom_sid
)
320 if (nb_name
&& *nb_name
) {
321 init_unistr2(&r_l
->uni_nb_dom_name
, nb_name
, UNI_FLAGS_NONE
);
322 init_uni_hdr(&r_l
->hdr_nb_dom_name
, &r_l
->uni_nb_dom_name
);
323 r_l
->hdr_nb_dom_name
.uni_max_len
+= 2;
324 r_l
->uni_nb_dom_name
.uni_max_len
+= 1;
327 if (dns_name
&& *dns_name
) {
328 init_unistr2(&r_l
->uni_dns_dom_name
, dns_name
, UNI_FLAGS_NONE
);
329 init_uni_hdr(&r_l
->hdr_dns_dom_name
, &r_l
->uni_dns_dom_name
);
330 r_l
->hdr_dns_dom_name
.uni_max_len
+= 2;
331 r_l
->uni_dns_dom_name
.uni_max_len
+= 1;
334 if (forest_name
&& *forest_name
) {
335 init_unistr2(&r_l
->uni_forest_name
, forest_name
, UNI_FLAGS_NONE
);
336 init_uni_hdr(&r_l
->hdr_forest_name
, &r_l
->uni_forest_name
);
337 r_l
->hdr_forest_name
.uni_max_len
+= 2;
338 r_l
->uni_forest_name
.uni_max_len
+= 1;
341 /* how do we init the guid ? probably should write an init fn */
343 memcpy(&r_l
->dom_guid
, dom_guid
, sizeof(struct GUID
));
347 r_l
->ptr_dom_sid
= 1;
348 init_dom_sid2(&r_l
->dom_sid
, dom_sid
);
351 #endif /* AD DC work in ongoing in Samba 4 */
354 /***************************************************************************
356 ***************************************************************************/
358 NTSTATUS
_lsa_OpenPolicy2(pipes_struct
*p
,
359 struct lsa_OpenPolicy2
*r
)
361 struct lsa_info
*info
;
362 SEC_DESC
*psd
= NULL
;
364 uint32 des_access
= r
->in
.access_mask
;
369 /* map the generic bits to the lsa policy ones */
370 se_map_generic(&des_access
, &lsa_generic_mapping
);
372 /* get the generic lsa policy SD until we store it */
373 lsa_get_generic_sd(p
->mem_ctx
, &psd
, &sd_size
);
375 status
= se_access_check(psd
, p
->server_info
->ptok
, des_access
,
377 if (!NT_STATUS_IS_OK(status
)) {
378 if (p
->server_info
->utok
.uid
!= sec_initial_uid()) {
381 DEBUG(4,("ACCESS should be DENIED (granted: %#010x; required: %#010x)\n",
382 acc_granted
, des_access
));
383 DEBUGADD(4,("but overwritten by euid == 0\n"));
386 /* This is needed for lsa_open_account and rpcclient .... :-) */
388 if (p
->server_info
->utok
.uid
== sec_initial_uid())
389 acc_granted
= LSA_POLICY_ALL_ACCESS
;
391 /* associate the domain SID with the (unique) handle. */
392 info
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_info
);
394 return NT_STATUS_NO_MEMORY
;
397 sid_copy(&info
->sid
,get_global_sam_sid());
398 info
->access
= acc_granted
;
400 /* set up the LSA QUERY INFO response */
401 if (!create_policy_hnd(p
, r
->out
.handle
, info
))
402 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
407 /***************************************************************************
409 ***************************************************************************/
411 NTSTATUS
_lsa_OpenPolicy(pipes_struct
*p
,
412 struct lsa_OpenPolicy
*r
)
414 struct lsa_info
*info
;
415 SEC_DESC
*psd
= NULL
;
417 uint32 des_access
= r
->in
.access_mask
;
422 /* map the generic bits to the lsa policy ones */
423 se_map_generic(&des_access
, &lsa_generic_mapping
);
425 /* get the generic lsa policy SD until we store it */
426 lsa_get_generic_sd(p
->mem_ctx
, &psd
, &sd_size
);
428 status
= se_access_check(psd
, p
->server_info
->ptok
, des_access
,
430 if (!NT_STATUS_IS_OK(status
)) {
431 if (p
->server_info
->utok
.uid
!= sec_initial_uid()) {
434 DEBUG(4,("ACCESS should be DENIED (granted: %#010x; required: %#010x)\n",
435 acc_granted
, des_access
));
436 DEBUGADD(4,("but overwritten by euid == 0\n"));
437 acc_granted
= des_access
;
440 /* associate the domain SID with the (unique) handle. */
441 info
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_info
);
443 return NT_STATUS_NO_MEMORY
;
446 sid_copy(&info
->sid
,get_global_sam_sid());
447 info
->access
= acc_granted
;
449 /* set up the LSA QUERY INFO response */
450 if (!create_policy_hnd(p
, r
->out
.handle
, info
))
451 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
456 /***************************************************************************
457 _lsa_EnumTrustDom - this needs fixing to do more than return NULL ! JRA.
459 ***************************************************************************/
461 NTSTATUS
_lsa_EnumTrustDom(pipes_struct
*p
,
462 struct lsa_EnumTrustDom
*r
)
464 struct lsa_info
*info
;
466 struct trustdom_info
**domains
;
467 struct lsa_DomainInfo
*lsa_domains
= NULL
;
471 * preferred length is set to 5 as a "our" preferred length
472 * nt sets this parameter to 2
473 * update (20.08.2002): it's not preferred length, but preferred size!
474 * it needs further investigation how to optimally choose this value
476 uint32 max_num_domains
=
477 r
->in
.max_size
< 5 ? r
->in
.max_size
: 10;
482 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
483 return NT_STATUS_INVALID_HANDLE
;
485 /* check if the user has enough rights */
486 if (!(info
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
487 return NT_STATUS_ACCESS_DENIED
;
490 nt_status
= pdb_enum_trusteddoms(p
->mem_ctx
, &num_domains
, &domains
);
493 if (!NT_STATUS_IS_OK(nt_status
)) {
497 if (*r
->in
.resume_handle
< num_domains
) {
498 num_thistime
= MIN(num_domains
, max_num_domains
);
500 nt_status
= STATUS_MORE_ENTRIES
;
502 if (*r
->in
.resume_handle
+ num_thistime
> num_domains
) {
503 num_thistime
= num_domains
- *r
->in
.resume_handle
;
504 nt_status
= NT_STATUS_OK
;
507 next_idx
= *r
->in
.resume_handle
+ num_thistime
;
510 next_idx
= 0xffffffff;
511 nt_status
= NT_STATUS_NO_MORE_ENTRIES
;
514 /* set up the lsa_enum_trust_dom response */
516 lsa_domains
= TALLOC_ZERO_ARRAY(p
->mem_ctx
, struct lsa_DomainInfo
,
519 return NT_STATUS_NO_MEMORY
;
522 for (i
=0; i
<num_thistime
; i
++) {
523 init_lsa_StringLarge(&lsa_domains
[i
].name
, domains
[i
]->name
);
524 lsa_domains
[i
].sid
= &domains
[i
]->sid
;
527 *r
->out
.resume_handle
= next_idx
;
528 r
->out
.domains
->count
= num_thistime
;
529 r
->out
.domains
->domains
= lsa_domains
;
534 #define LSA_AUDIT_NUM_CATEGORIES_NT4 7
535 #define LSA_AUDIT_NUM_CATEGORIES_WIN2K 9
536 #define LSA_AUDIT_NUM_CATEGORIES LSA_AUDIT_NUM_CATEGORIES_NT4
538 /***************************************************************************
540 ***************************************************************************/
542 NTSTATUS
_lsa_QueryInfoPolicy(pipes_struct
*p
,
543 struct lsa_QueryInfoPolicy
*r
)
545 NTSTATUS status
= NT_STATUS_OK
;
546 struct lsa_info
*handle
;
550 union lsa_PolicyInformation
*info
= NULL
;
552 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
))
553 return NT_STATUS_INVALID_HANDLE
;
555 info
= TALLOC_ZERO_P(p
->mem_ctx
, union lsa_PolicyInformation
);
557 return NT_STATUS_NO_MEMORY
;
560 switch (r
->in
.level
) {
564 uint32 policy_def
= LSA_AUDIT_POLICY_ALL
;
566 /* check if the user has enough rights */
567 if (!(handle
->access
& LSA_POLICY_VIEW_AUDIT_INFORMATION
)) {
568 DEBUG(10,("_lsa_QueryInfoPolicy: insufficient access rights\n"));
569 return NT_STATUS_ACCESS_DENIED
;
572 /* fake info: We audit everything. ;) */
574 info
->audit_events
.auditing_mode
= true;
575 info
->audit_events
.count
= LSA_AUDIT_NUM_CATEGORIES
;
576 info
->audit_events
.settings
= TALLOC_ZERO_ARRAY(p
->mem_ctx
,
577 enum lsa_PolicyAuditPolicy
,
578 info
->audit_events
.count
);
579 if (!info
->audit_events
.settings
) {
580 return NT_STATUS_NO_MEMORY
;
583 info
->audit_events
.settings
[LSA_AUDIT_CATEGORY_ACCOUNT_MANAGEMENT
] = policy_def
;
584 info
->audit_events
.settings
[LSA_AUDIT_CATEGORY_FILE_AND_OBJECT_ACCESS
] = policy_def
;
585 info
->audit_events
.settings
[LSA_AUDIT_CATEGORY_LOGON
] = policy_def
;
586 info
->audit_events
.settings
[LSA_AUDIT_CATEGORY_PROCCESS_TRACKING
] = policy_def
;
587 info
->audit_events
.settings
[LSA_AUDIT_CATEGORY_SECURITY_POLICY_CHANGES
] = policy_def
;
588 info
->audit_events
.settings
[LSA_AUDIT_CATEGORY_SYSTEM
] = policy_def
;
589 info
->audit_events
.settings
[LSA_AUDIT_CATEGORY_USE_OF_USER_RIGHTS
] = policy_def
;
594 /* check if the user has enough rights */
595 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
596 return NT_STATUS_ACCESS_DENIED
;
598 /* Request PolicyPrimaryDomainInformation. */
599 switch (lp_server_role()) {
600 case ROLE_DOMAIN_PDC
:
601 case ROLE_DOMAIN_BDC
:
602 name
= get_global_sam_name();
603 sid
= sid_dup_talloc(p
->mem_ctx
, get_global_sam_sid());
605 return NT_STATUS_NO_MEMORY
;
608 case ROLE_DOMAIN_MEMBER
:
609 name
= lp_workgroup();
610 /* We need to return the Domain SID here. */
611 if (secrets_fetch_domain_sid(lp_workgroup(), &domain_sid
)) {
612 sid
= sid_dup_talloc(p
->mem_ctx
, &domain_sid
);
614 return NT_STATUS_NO_MEMORY
;
617 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO
;
620 case ROLE_STANDALONE
:
621 name
= lp_workgroup();
625 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO
;
627 init_dom_query_3(&info
->domain
, name
, sid
);
630 /* check if the user has enough rights */
631 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
632 return NT_STATUS_ACCESS_DENIED
;
634 /* Request PolicyAccountDomainInformation. */
635 name
= get_global_sam_name();
636 sid
= get_global_sam_sid();
638 init_dom_query_5(&info
->account_domain
, name
, sid
);
641 /* check if the user has enough rights */
642 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
643 return NT_STATUS_ACCESS_DENIED
;
645 switch (lp_server_role()) {
646 case ROLE_DOMAIN_BDC
:
648 * only a BDC is a backup controller
649 * of the domain, it controls.
651 info
->role
.role
= LSA_ROLE_BACKUP
;
655 * any other role is a primary
656 * of the domain, it controls.
658 info
->role
.role
= LSA_ROLE_PRIMARY
;
663 DEBUG(0,("_lsa_QueryInfoPolicy: unknown info level in Lsa Query: %d\n",
665 status
= NT_STATUS_INVALID_INFO_CLASS
;
674 /***************************************************************************
675 _lsa_lookup_sids_internal
676 ***************************************************************************/
678 static NTSTATUS
_lsa_lookup_sids_internal(pipes_struct
*p
,
680 uint16_t level
, /* input */
681 int num_sids
, /* input */
682 struct lsa_SidPtr
*sid
, /* input */
683 struct lsa_RefDomainList
**pp_ref
, /* input/output */
684 struct lsa_TranslatedName2
**pp_names
,/* input/output */
685 uint32_t *pp_mapped_count
) /* input/output */
689 const DOM_SID
**sids
= NULL
;
690 struct lsa_RefDomainList
*ref
= NULL
;
691 uint32 mapped_count
= 0;
692 struct lsa_dom_info
*dom_infos
= NULL
;
693 struct lsa_name_info
*name_infos
= NULL
;
694 struct lsa_TranslatedName2
*names
= NULL
;
696 *pp_mapped_count
= 0;
704 sids
= TALLOC_ARRAY(p
->mem_ctx
, const DOM_SID
*, num_sids
);
705 ref
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_RefDomainList
);
707 if (sids
== NULL
|| ref
== NULL
) {
708 return NT_STATUS_NO_MEMORY
;
711 for (i
=0; i
<num_sids
; i
++) {
712 sids
[i
] = sid
[i
].sid
;
715 status
= lookup_sids(p
->mem_ctx
, num_sids
, sids
, level
,
716 &dom_infos
, &name_infos
);
718 if (!NT_STATUS_IS_OK(status
)) {
722 names
= TALLOC_ARRAY(p
->mem_ctx
, struct lsa_TranslatedName2
, num_sids
);
724 return NT_STATUS_NO_MEMORY
;
727 for (i
=0; i
<LSA_REF_DOMAIN_LIST_MULTIPLIER
; i
++) {
729 if (!dom_infos
[i
].valid
) {
733 if (init_lsa_ref_domain_list(mem_ctx
, ref
,
735 &dom_infos
[i
].sid
) != i
) {
736 DEBUG(0, ("Domain %s mentioned twice??\n",
738 return NT_STATUS_INTERNAL_ERROR
;
742 for (i
=0; i
<num_sids
; i
++) {
743 struct lsa_name_info
*name
= &name_infos
[i
];
745 if (name
->type
== SID_NAME_UNKNOWN
) {
748 /* Unknown sids should return the string
749 * representation of the SID. Windows 2003 behaves
750 * rather erratic here, in many cases it returns the
751 * RID as 8 bytes hex, in others it returns the full
752 * SID. We (Jerry/VL) could not figure out which the
753 * hard cases are, so leave it with the SID. */
754 name
->name
= talloc_asprintf(p
->mem_ctx
, "%s",
757 if (name
->name
== NULL
) {
758 return NT_STATUS_NO_MEMORY
;
764 names
[i
].sid_type
= name
->type
;
765 names
[i
].name
.string
= name
->name
;
766 names
[i
].sid_index
= name
->dom_idx
;
767 names
[i
].unknown
= 0;
770 status
= NT_STATUS_NONE_MAPPED
;
771 if (mapped_count
> 0) {
772 status
= (mapped_count
< num_sids
) ?
773 STATUS_SOME_UNMAPPED
: NT_STATUS_OK
;
776 DEBUG(10, ("num_sids %d, mapped_count %d, status %s\n",
777 num_sids
, mapped_count
, nt_errstr(status
)));
779 *pp_mapped_count
= mapped_count
;
786 /***************************************************************************
788 ***************************************************************************/
790 NTSTATUS
_lsa_LookupSids(pipes_struct
*p
,
791 struct lsa_LookupSids
*r
)
794 struct lsa_info
*handle
;
795 int num_sids
= r
->in
.sids
->num_sids
;
796 uint32 mapped_count
= 0;
797 struct lsa_RefDomainList
*domains
= NULL
;
798 struct lsa_TranslatedName
*names_out
= NULL
;
799 struct lsa_TranslatedName2
*names
= NULL
;
802 if ((r
->in
.level
< 1) || (r
->in
.level
> 6)) {
803 return NT_STATUS_INVALID_PARAMETER
;
806 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
)) {
807 return NT_STATUS_INVALID_HANDLE
;
810 /* check if the user has enough rights */
811 if (!(handle
->access
& LSA_POLICY_LOOKUP_NAMES
)) {
812 return NT_STATUS_ACCESS_DENIED
;
815 if (num_sids
> MAX_LOOKUP_SIDS
) {
816 DEBUG(5,("_lsa_LookupSids: limit of %d exceeded, requested %d\n",
817 MAX_LOOKUP_SIDS
, num_sids
));
818 return NT_STATUS_NONE_MAPPED
;
821 status
= _lsa_lookup_sids_internal(p
,
830 /* Only return here when there is a real error.
831 NT_STATUS_NONE_MAPPED is a special case as it indicates that none of
832 the requested sids could be resolved. Older versions of XP (pre SP3)
833 rely that we return with the string representations of those SIDs in
834 that case. If we don't, XP crashes - Guenther
837 if (NT_STATUS_IS_ERR(status
) &&
838 !NT_STATUS_EQUAL(status
, NT_STATUS_NONE_MAPPED
)) {
842 /* Convert from lsa_TranslatedName2 to lsa_TranslatedName */
843 names_out
= TALLOC_ARRAY(p
->mem_ctx
, struct lsa_TranslatedName
,
846 return NT_STATUS_NO_MEMORY
;
849 for (i
=0; i
<num_sids
; i
++) {
850 names_out
[i
].sid_type
= names
[i
].sid_type
;
851 names_out
[i
].name
= names
[i
].name
;
852 names_out
[i
].sid_index
= names
[i
].sid_index
;
855 *r
->out
.domains
= domains
;
856 r
->out
.names
->count
= num_sids
;
857 r
->out
.names
->names
= names_out
;
858 *r
->out
.count
= mapped_count
;
863 /***************************************************************************
865 ***************************************************************************/
867 NTSTATUS
_lsa_LookupSids2(pipes_struct
*p
,
868 struct lsa_LookupSids2
*r
)
871 struct lsa_info
*handle
;
872 int num_sids
= r
->in
.sids
->num_sids
;
873 uint32 mapped_count
= 0;
874 struct lsa_RefDomainList
*domains
= NULL
;
875 struct lsa_TranslatedName2
*names
= NULL
;
876 bool check_policy
= true;
878 switch (p
->hdr_req
.opnum
) {
879 case NDR_LSA_LOOKUPSIDS3
:
880 check_policy
= false;
882 case NDR_LSA_LOOKUPSIDS2
:
887 if ((r
->in
.level
< 1) || (r
->in
.level
> 6)) {
888 return NT_STATUS_INVALID_PARAMETER
;
892 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
)) {
893 return NT_STATUS_INVALID_HANDLE
;
896 /* check if the user has enough rights */
897 if (!(handle
->access
& LSA_POLICY_LOOKUP_NAMES
)) {
898 return NT_STATUS_ACCESS_DENIED
;
902 if (num_sids
> MAX_LOOKUP_SIDS
) {
903 DEBUG(5,("_lsa_LookupSids2: limit of %d exceeded, requested %d\n",
904 MAX_LOOKUP_SIDS
, num_sids
));
905 return NT_STATUS_NONE_MAPPED
;
908 status
= _lsa_lookup_sids_internal(p
,
917 *r
->out
.domains
= domains
;
918 r
->out
.names
->count
= num_sids
;
919 r
->out
.names
->names
= names
;
920 *r
->out
.count
= mapped_count
;
925 /***************************************************************************
927 ***************************************************************************/
929 NTSTATUS
_lsa_LookupSids3(pipes_struct
*p
,
930 struct lsa_LookupSids3
*r
)
932 struct lsa_LookupSids2 q
;
934 /* No policy handle on this call. Restrict to crypto connections. */
935 if (p
->auth
.auth_type
!= PIPE_AUTH_TYPE_SCHANNEL
) {
936 DEBUG(0,("_lsa_LookupSids3: client %s not using schannel for netlogon\n",
937 get_remote_machine_name() ));
938 return NT_STATUS_INVALID_PARAMETER
;
942 q
.in
.sids
= r
->in
.sids
;
943 q
.in
.level
= r
->in
.level
;
944 q
.in
.unknown1
= r
->in
.unknown1
;
945 q
.in
.unknown2
= r
->in
.unknown2
;
946 q
.in
.names
= r
->in
.names
;
947 q
.in
.count
= r
->in
.count
;
949 q
.out
.domains
= r
->out
.domains
;
950 q
.out
.names
= r
->out
.names
;
951 q
.out
.count
= r
->out
.count
;
953 return _lsa_LookupSids2(p
, &q
);
956 /***************************************************************************
957 ***************************************************************************/
959 static int lsa_lookup_level_to_flags(uint16 level
)
965 flags
= LOOKUP_NAME_ALL
;
968 flags
= LOOKUP_NAME_DOMAIN
|LOOKUP_NAME_REMOTE
|LOOKUP_NAME_ISOLATED
;
971 flags
= LOOKUP_NAME_DOMAIN
|LOOKUP_NAME_ISOLATED
;
977 flags
= LOOKUP_NAME_NONE
;
984 /***************************************************************************
986 ***************************************************************************/
988 NTSTATUS
_lsa_LookupNames(pipes_struct
*p
,
989 struct lsa_LookupNames
*r
)
991 NTSTATUS status
= NT_STATUS_NONE_MAPPED
;
992 struct lsa_info
*handle
;
993 struct lsa_String
*names
= r
->in
.names
;
994 uint32 num_entries
= r
->in
.num_names
;
995 struct lsa_RefDomainList
*domains
= NULL
;
996 struct lsa_TranslatedSid
*rids
= NULL
;
997 uint32 mapped_count
= 0;
1000 if (num_entries
> MAX_LOOKUP_SIDS
) {
1001 num_entries
= MAX_LOOKUP_SIDS
;
1002 DEBUG(5,("_lsa_LookupNames: truncating name lookup list to %d\n",
1006 flags
= lsa_lookup_level_to_flags(r
->in
.level
);
1008 domains
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_RefDomainList
);
1010 return NT_STATUS_NO_MEMORY
;
1014 rids
= TALLOC_ZERO_ARRAY(p
->mem_ctx
, struct lsa_TranslatedSid
,
1017 return NT_STATUS_NO_MEMORY
;
1023 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
)) {
1024 status
= NT_STATUS_INVALID_HANDLE
;
1028 /* check if the user has enough rights */
1029 if (!(handle
->access
& LSA_POLICY_LOOKUP_NAMES
)) {
1030 status
= NT_STATUS_ACCESS_DENIED
;
1034 /* set up the LSA Lookup RIDs response */
1035 become_root(); /* lookup_name can require root privs */
1036 status
= lookup_lsa_rids(p
->mem_ctx
, domains
, rids
, num_entries
,
1037 names
, flags
, &mapped_count
);
1042 if (NT_STATUS_IS_OK(status
) && (num_entries
!= 0) ) {
1043 if (mapped_count
== 0) {
1044 status
= NT_STATUS_NONE_MAPPED
;
1045 } else if (mapped_count
!= num_entries
) {
1046 status
= STATUS_SOME_UNMAPPED
;
1050 *r
->out
.count
= mapped_count
;
1051 *r
->out
.domains
= domains
;
1052 r
->out
.sids
->sids
= rids
;
1053 r
->out
.sids
->count
= num_entries
;
1058 /***************************************************************************
1060 ***************************************************************************/
1062 NTSTATUS
_lsa_LookupNames2(pipes_struct
*p
,
1063 struct lsa_LookupNames2
*r
)
1066 struct lsa_LookupNames q
;
1067 struct lsa_TransSidArray2
*sid_array2
= r
->in
.sids
;
1068 struct lsa_TransSidArray
*sid_array
= NULL
;
1071 sid_array
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_TransSidArray
);
1073 return NT_STATUS_NO_MEMORY
;
1076 q
.in
.handle
= r
->in
.handle
;
1077 q
.in
.num_names
= r
->in
.num_names
;
1078 q
.in
.names
= r
->in
.names
;
1079 q
.in
.level
= r
->in
.level
;
1080 q
.in
.sids
= sid_array
;
1081 q
.in
.count
= r
->in
.count
;
1082 /* we do not know what this is for */
1083 /* = r->in.unknown1; */
1084 /* = r->in.unknown2; */
1086 q
.out
.domains
= r
->out
.domains
;
1087 q
.out
.sids
= sid_array
;
1088 q
.out
.count
= r
->out
.count
;
1090 status
= _lsa_LookupNames(p
, &q
);
1092 sid_array2
->count
= sid_array
->count
;
1093 sid_array2
->sids
= TALLOC_ARRAY(p
->mem_ctx
, struct lsa_TranslatedSid2
, sid_array
->count
);
1094 if (!sid_array2
->sids
) {
1095 return NT_STATUS_NO_MEMORY
;
1098 for (i
=0; i
<sid_array
->count
; i
++) {
1099 sid_array2
->sids
[i
].sid_type
= sid_array
->sids
[i
].sid_type
;
1100 sid_array2
->sids
[i
].rid
= sid_array
->sids
[i
].rid
;
1101 sid_array2
->sids
[i
].sid_index
= sid_array
->sids
[i
].sid_index
;
1102 sid_array2
->sids
[i
].unknown
= 0;
1105 r
->out
.sids
= sid_array2
;
1110 /***************************************************************************
1112 ***************************************************************************/
1114 NTSTATUS
_lsa_LookupNames3(pipes_struct
*p
,
1115 struct lsa_LookupNames3
*r
)
1118 struct lsa_info
*handle
;
1119 struct lsa_String
*names
= r
->in
.names
;
1120 uint32 num_entries
= r
->in
.num_names
;
1121 struct lsa_RefDomainList
*domains
= NULL
;
1122 struct lsa_TranslatedSid3
*trans_sids
= NULL
;
1123 uint32 mapped_count
= 0;
1125 bool check_policy
= true;
1127 switch (p
->hdr_req
.opnum
) {
1128 case NDR_LSA_LOOKUPNAMES4
:
1129 check_policy
= false;
1131 case NDR_LSA_LOOKUPNAMES3
:
1133 check_policy
= true;
1136 if (num_entries
> MAX_LOOKUP_SIDS
) {
1137 num_entries
= MAX_LOOKUP_SIDS
;
1138 DEBUG(5,("_lsa_LookupNames3: truncating name lookup list to %d\n", num_entries
));
1141 /* Probably the lookup_level is some sort of bitmask. */
1142 if (r
->in
.level
== 1) {
1143 flags
= LOOKUP_NAME_ALL
;
1146 domains
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_RefDomainList
);
1148 return NT_STATUS_NO_MEMORY
;
1152 trans_sids
= TALLOC_ZERO_ARRAY(p
->mem_ctx
, struct lsa_TranslatedSid3
,
1155 return NT_STATUS_NO_MEMORY
;
1163 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
)) {
1164 status
= NT_STATUS_INVALID_HANDLE
;
1168 /* check if the user has enough rights */
1169 if (!(handle
->access
& LSA_POLICY_LOOKUP_NAMES
)) {
1170 status
= NT_STATUS_ACCESS_DENIED
;
1175 /* set up the LSA Lookup SIDs response */
1176 become_root(); /* lookup_name can require root privs */
1177 status
= lookup_lsa_sids(p
->mem_ctx
, domains
, trans_sids
, num_entries
,
1178 names
, flags
, &mapped_count
);
1183 if (NT_STATUS_IS_OK(status
)) {
1184 if (mapped_count
== 0) {
1185 status
= NT_STATUS_NONE_MAPPED
;
1186 } else if (mapped_count
!= num_entries
) {
1187 status
= STATUS_SOME_UNMAPPED
;
1191 *r
->out
.count
= mapped_count
;
1192 *r
->out
.domains
= domains
;
1193 r
->out
.sids
->sids
= trans_sids
;
1194 r
->out
.sids
->count
= num_entries
;
1199 /***************************************************************************
1201 ***************************************************************************/
1203 NTSTATUS
_lsa_LookupNames4(pipes_struct
*p
,
1204 struct lsa_LookupNames4
*r
)
1206 struct lsa_LookupNames3 q
;
1208 /* No policy handle on this call. Restrict to crypto connections. */
1209 if (p
->auth
.auth_type
!= PIPE_AUTH_TYPE_SCHANNEL
) {
1210 DEBUG(0,("_lsa_lookup_names4: client %s not using schannel for netlogon\n",
1211 get_remote_machine_name() ));
1212 return NT_STATUS_INVALID_PARAMETER
;
1216 q
.in
.num_names
= r
->in
.num_names
;
1217 q
.in
.names
= r
->in
.names
;
1218 q
.in
.level
= r
->in
.level
;
1219 q
.in
.lookup_options
= r
->in
.lookup_options
;
1220 q
.in
.client_revision
= r
->in
.client_revision
;
1221 q
.in
.sids
= r
->in
.sids
;
1222 q
.in
.count
= r
->in
.count
;
1224 q
.out
.domains
= r
->out
.domains
;
1225 q
.out
.sids
= r
->out
.sids
;
1226 q
.out
.count
= r
->out
.count
;
1228 return _lsa_LookupNames3(p
, &q
);
1231 /***************************************************************************
1232 _lsa_close. Also weird - needs to check if lsa handle is correct. JRA.
1233 ***************************************************************************/
1235 NTSTATUS
_lsa_Close(pipes_struct
*p
, struct lsa_Close
*r
)
1237 if (!find_policy_by_hnd(p
, r
->in
.handle
, NULL
)) {
1238 return NT_STATUS_INVALID_HANDLE
;
1241 close_policy_hnd(p
, r
->in
.handle
);
1242 ZERO_STRUCTP(r
->out
.handle
);
1243 return NT_STATUS_OK
;
1246 /***************************************************************************
1247 ***************************************************************************/
1249 NTSTATUS
_lsa_OpenSecret(pipes_struct
*p
, struct lsa_OpenSecret
*r
)
1251 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1254 /***************************************************************************
1255 ***************************************************************************/
1257 NTSTATUS
_lsa_OpenTrustedDomain(pipes_struct
*p
, struct lsa_OpenTrustedDomain
*r
)
1259 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1262 /***************************************************************************
1263 ***************************************************************************/
1265 NTSTATUS
_lsa_CreateTrustedDomain(pipes_struct
*p
, struct lsa_CreateTrustedDomain
*r
)
1267 return NT_STATUS_ACCESS_DENIED
;
1270 /***************************************************************************
1271 ***************************************************************************/
1273 NTSTATUS
_lsa_CreateSecret(pipes_struct
*p
, struct lsa_CreateSecret
*r
)
1275 return NT_STATUS_ACCESS_DENIED
;
1278 /***************************************************************************
1279 ***************************************************************************/
1281 NTSTATUS
_lsa_SetSecret(pipes_struct
*p
, struct lsa_SetSecret
*r
)
1283 return NT_STATUS_ACCESS_DENIED
;
1286 /***************************************************************************
1288 ***************************************************************************/
1290 NTSTATUS
_lsa_DeleteObject(pipes_struct
*p
,
1291 struct lsa_DeleteObject
*r
)
1293 return NT_STATUS_ACCESS_DENIED
;
1296 /***************************************************************************
1298 ***************************************************************************/
1300 NTSTATUS
_lsa_EnumPrivs(pipes_struct
*p
,
1301 struct lsa_EnumPrivs
*r
)
1303 struct lsa_info
*handle
;
1305 uint32 enum_context
= *r
->in
.resume_handle
;
1306 int num_privs
= count_all_privileges();
1307 struct lsa_PrivEntry
*entries
= NULL
;
1310 /* remember that the enum_context starts at 0 and not 1 */
1312 if ( enum_context
>= num_privs
)
1313 return NT_STATUS_NO_MORE_ENTRIES
;
1315 DEBUG(10,("_lsa_EnumPrivs: enum_context:%d total entries:%d\n",
1316 enum_context
, num_privs
));
1318 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
))
1319 return NT_STATUS_INVALID_HANDLE
;
1321 /* check if the user has enough rights
1322 I don't know if it's the right one. not documented. */
1324 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
1325 return NT_STATUS_ACCESS_DENIED
;
1328 entries
= TALLOC_ZERO_ARRAY(p
->mem_ctx
, struct lsa_PrivEntry
, num_privs
);
1330 return NT_STATUS_NO_MEMORY
;
1336 for (i
= 0; i
< num_privs
; i
++) {
1337 if( i
< enum_context
) {
1339 init_lsa_StringLarge(&entries
[i
].name
, NULL
);
1341 entries
[i
].luid
.low
= 0;
1342 entries
[i
].luid
.high
= 0;
1345 init_lsa_StringLarge(&entries
[i
].name
, privs
[i
].name
);
1347 luid
= get_privilege_luid( &privs
[i
].se_priv
);
1349 entries
[i
].luid
.low
= luid
.luid
.low
;
1350 entries
[i
].luid
.high
= luid
.luid
.high
;
1354 enum_context
= num_privs
;
1356 *r
->out
.resume_handle
= enum_context
;
1357 r
->out
.privs
->count
= num_privs
;
1358 r
->out
.privs
->privs
= entries
;
1360 return NT_STATUS_OK
;
1363 /***************************************************************************
1364 _lsa_LookupPrivDisplayName
1365 ***************************************************************************/
1367 NTSTATUS
_lsa_LookupPrivDisplayName(pipes_struct
*p
,
1368 struct lsa_LookupPrivDisplayName
*r
)
1370 struct lsa_info
*handle
;
1371 const char *description
;
1372 struct lsa_StringLarge
*lsa_name
;
1374 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
))
1375 return NT_STATUS_INVALID_HANDLE
;
1377 /* check if the user has enough rights */
1380 * I don't know if it's the right one. not documented.
1382 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
1383 return NT_STATUS_ACCESS_DENIED
;
1385 DEBUG(10,("_lsa_LookupPrivDisplayName: name = %s\n", r
->in
.name
->string
));
1387 description
= get_privilege_dispname(r
->in
.name
->string
);
1389 DEBUG(10,("_lsa_LookupPrivDisplayName: doesn't exist\n"));
1390 return NT_STATUS_NO_SUCH_PRIVILEGE
;
1393 DEBUG(10,("_lsa_LookupPrivDisplayName: display name = %s\n", description
));
1395 lsa_name
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_StringLarge
);
1397 return NT_STATUS_NO_MEMORY
;
1400 init_lsa_StringLarge(lsa_name
, description
);
1402 *r
->out
.returned_language_id
= r
->in
.language_id
;
1403 *r
->out
.disp_name
= lsa_name
;
1405 return NT_STATUS_OK
;
1408 /***************************************************************************
1410 ***************************************************************************/
1412 NTSTATUS
_lsa_EnumAccounts(pipes_struct
*p
,
1413 struct lsa_EnumAccounts
*r
)
1415 struct lsa_info
*handle
;
1417 int i
, j
, num_entries
;
1419 struct lsa_SidPtr
*sids
= NULL
;
1421 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
))
1422 return NT_STATUS_INVALID_HANDLE
;
1424 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
1425 return NT_STATUS_ACCESS_DENIED
;
1430 /* The only way we can currently find out all the SIDs that have been
1431 privileged is to scan all privileges */
1433 status
= privilege_enumerate_accounts(&sid_list
, &num_entries
);
1434 if (!NT_STATUS_IS_OK(status
)) {
1438 if (*r
->in
.resume_handle
>= num_entries
) {
1439 return NT_STATUS_NO_MORE_ENTRIES
;
1442 if (num_entries
- *r
->in
.resume_handle
) {
1443 sids
= TALLOC_ZERO_ARRAY(p
->mem_ctx
, struct lsa_SidPtr
,
1444 num_entries
- *r
->in
.resume_handle
);
1446 talloc_free(sid_list
);
1447 return NT_STATUS_NO_MEMORY
;
1450 for (i
= *r
->in
.resume_handle
, j
= 0; i
< num_entries
; i
++, j
++) {
1451 sids
[j
].sid
= sid_dup_talloc(p
->mem_ctx
, &sid_list
[i
]);
1453 talloc_free(sid_list
);
1454 return NT_STATUS_NO_MEMORY
;
1459 talloc_free(sid_list
);
1461 *r
->out
.resume_handle
= num_entries
;
1462 r
->out
.sids
->num_sids
= num_entries
;
1463 r
->out
.sids
->sids
= sids
;
1465 return NT_STATUS_OK
;
1468 /***************************************************************************
1470 ***************************************************************************/
1472 NTSTATUS
_lsa_GetUserName(pipes_struct
*p
,
1473 struct lsa_GetUserName
*r
)
1475 const char *username
, *domname
;
1476 struct lsa_String
*account_name
= NULL
;
1477 struct lsa_String
*authority_name
= NULL
;
1479 if (r
->in
.account_name
&&
1480 *r
->in
.account_name
) {
1481 return NT_STATUS_INVALID_PARAMETER
;
1484 if (r
->in
.authority_name
&&
1485 *r
->in
.authority_name
) {
1486 return NT_STATUS_INVALID_PARAMETER
;
1489 if (p
->server_info
->guest
) {
1491 * I'm 99% sure this is not the right place to do this,
1492 * global_sid_Anonymous should probably be put into the token
1493 * instead of the guest id -- vl
1495 if (!lookup_sid(p
->mem_ctx
, &global_sid_Anonymous
,
1496 &domname
, &username
, NULL
)) {
1497 return NT_STATUS_NO_MEMORY
;
1500 username
= p
->server_info
->sanitized_username
;
1501 domname
= pdb_get_domain(p
->server_info
->sam_account
);
1504 account_name
= TALLOC_P(p
->mem_ctx
, struct lsa_String
);
1505 if (!account_name
) {
1506 return NT_STATUS_NO_MEMORY
;
1508 init_lsa_String(account_name
, username
);
1510 if (r
->out
.authority_name
) {
1511 authority_name
= TALLOC_P(p
->mem_ctx
, struct lsa_String
);
1512 if (!authority_name
) {
1513 return NT_STATUS_NO_MEMORY
;
1515 init_lsa_String(authority_name
, domname
);
1518 *r
->out
.account_name
= account_name
;
1519 if (r
->out
.authority_name
) {
1520 *r
->out
.authority_name
= authority_name
;
1523 return NT_STATUS_OK
;
1526 /***************************************************************************
1528 ***************************************************************************/
1530 NTSTATUS
_lsa_CreateAccount(pipes_struct
*p
,
1531 struct lsa_CreateAccount
*r
)
1533 struct lsa_info
*handle
;
1534 struct lsa_info
*info
;
1536 /* find the connection policy handle. */
1537 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
))
1538 return NT_STATUS_INVALID_HANDLE
;
1540 /* check if the user has enough rights */
1543 * I don't know if it's the right one. not documented.
1544 * but guessed with rpcclient.
1546 if (!(handle
->access
& LSA_POLICY_GET_PRIVATE_INFORMATION
))
1547 return NT_STATUS_ACCESS_DENIED
;
1549 /* check to see if the pipe_user is a Domain Admin since
1550 account_pol.tdb was already opened as root, this is all we have */
1552 if ( p
->server_info
->utok
.uid
!= sec_initial_uid()
1553 && !nt_token_check_domain_rid( p
->server_info
->ptok
,
1554 DOMAIN_GROUP_RID_ADMINS
) )
1555 return NT_STATUS_ACCESS_DENIED
;
1557 if ( is_privileged_sid( r
->in
.sid
) )
1558 return NT_STATUS_OBJECT_NAME_COLLISION
;
1560 /* associate the user/group SID with the (unique) handle. */
1562 info
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_info
);
1564 return NT_STATUS_NO_MEMORY
;
1567 info
->sid
= *r
->in
.sid
;
1568 info
->access
= r
->in
.access_mask
;
1570 /* get a (unique) handle. open a policy on it. */
1571 if (!create_policy_hnd(p
, r
->out
.acct_handle
, info
))
1572 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1574 return privilege_create_account( &info
->sid
);
1578 /***************************************************************************
1580 ***************************************************************************/
1582 NTSTATUS
_lsa_OpenAccount(pipes_struct
*p
,
1583 struct lsa_OpenAccount
*r
)
1585 struct lsa_info
*handle
;
1586 struct lsa_info
*info
;
1588 /* find the connection policy handle. */
1589 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
))
1590 return NT_STATUS_INVALID_HANDLE
;
1592 /* check if the user has enough rights */
1595 * I don't know if it's the right one. not documented.
1596 * but guessed with rpcclient.
1598 if (!(handle
->access
& LSA_POLICY_GET_PRIVATE_INFORMATION
))
1599 return NT_STATUS_ACCESS_DENIED
;
1601 /* TODO: Fis the parsing routine before reenabling this check! */
1603 if (!lookup_sid(&handle
->sid
, dom_name
, name
, &type
))
1604 return NT_STATUS_ACCESS_DENIED
;
1606 /* associate the user/group SID with the (unique) handle. */
1607 info
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_info
);
1609 return NT_STATUS_NO_MEMORY
;
1612 info
->sid
= *r
->in
.sid
;
1613 info
->access
= r
->in
.access_mask
;
1615 /* get a (unique) handle. open a policy on it. */
1616 if (!create_policy_hnd(p
, r
->out
.acct_handle
, info
))
1617 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1619 return NT_STATUS_OK
;
1622 /***************************************************************************
1623 _lsa_EnumPrivsAccount
1624 For a given SID, enumerate all the privilege this account has.
1625 ***************************************************************************/
1627 NTSTATUS
_lsa_EnumPrivsAccount(pipes_struct
*p
,
1628 struct lsa_EnumPrivsAccount
*r
)
1630 NTSTATUS status
= NT_STATUS_OK
;
1631 struct lsa_info
*info
=NULL
;
1633 PRIVILEGE_SET privileges
;
1634 struct lsa_PrivilegeSet
*priv_set
= NULL
;
1635 struct lsa_LUIDAttribute
*luid_attrs
= NULL
;
1638 /* find the connection policy handle. */
1639 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
1640 return NT_STATUS_INVALID_HANDLE
;
1642 if (!(info
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
1643 return NT_STATUS_ACCESS_DENIED
;
1645 if ( !get_privileges_for_sids( &mask
, &info
->sid
, 1 ) )
1646 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
1648 privilege_set_init( &privileges
);
1650 if ( se_priv_to_privilege_set( &privileges
, &mask
) ) {
1652 DEBUG(10,("_lsa_EnumPrivsAccount: %s has %d privileges\n",
1653 sid_string_dbg(&info
->sid
),
1656 priv_set
= TALLOC_ZERO_P(p
->mem_ctx
, struct lsa_PrivilegeSet
);
1658 status
= NT_STATUS_NO_MEMORY
;
1662 luid_attrs
= TALLOC_ZERO_ARRAY(p
->mem_ctx
,
1663 struct lsa_LUIDAttribute
,
1666 status
= NT_STATUS_NO_MEMORY
;
1670 for (i
=0; i
<privileges
.count
; i
++) {
1671 luid_attrs
[i
].luid
.low
= privileges
.set
[i
].luid
.low
;
1672 luid_attrs
[i
].luid
.high
= privileges
.set
[i
].luid
.high
;
1673 luid_attrs
[i
].attribute
= privileges
.set
[i
].attr
;
1676 priv_set
->count
= privileges
.count
;
1677 priv_set
->unknown
= 0;
1678 priv_set
->set
= luid_attrs
;
1680 *r
->out
.privs
= priv_set
;
1682 status
= NT_STATUS_NO_SUCH_PRIVILEGE
;
1686 privilege_set_free( &privileges
);
1691 /***************************************************************************
1692 _lsa_GetSystemAccessAccount
1693 ***************************************************************************/
1695 NTSTATUS
_lsa_GetSystemAccessAccount(pipes_struct
*p
,
1696 struct lsa_GetSystemAccessAccount
*r
)
1698 struct lsa_info
*info
=NULL
;
1700 /* find the connection policy handle. */
1702 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
1703 return NT_STATUS_INVALID_HANDLE
;
1705 if (!(info
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
1706 return NT_STATUS_ACCESS_DENIED
;
1708 if (!lookup_sid(p
->mem_ctx
, &info
->sid
, NULL
, NULL
, NULL
))
1709 return NT_STATUS_ACCESS_DENIED
;
1712 0x01 -> Log on locally
1713 0x02 -> Access this computer from network
1714 0x04 -> Log on as a batch job
1715 0x10 -> Log on as a service
1717 they can be ORed together
1720 *r
->out
.access_mask
= LSA_POLICY_MODE_INTERACTIVE
|
1721 LSA_POLICY_MODE_NETWORK
;
1723 return NT_STATUS_OK
;
1726 /***************************************************************************
1727 update the systemaccount information
1728 ***************************************************************************/
1730 NTSTATUS
_lsa_SetSystemAccessAccount(pipes_struct
*p
,
1731 struct lsa_SetSystemAccessAccount
*r
)
1733 struct lsa_info
*info
=NULL
;
1736 /* find the connection policy handle. */
1737 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
1738 return NT_STATUS_INVALID_HANDLE
;
1740 /* check to see if the pipe_user is a Domain Admin since
1741 account_pol.tdb was already opened as root, this is all we have */
1743 if ( p
->server_info
->utok
.uid
!= sec_initial_uid()
1744 && !nt_token_check_domain_rid( p
->server_info
->ptok
,
1745 DOMAIN_GROUP_RID_ADMINS
) )
1746 return NT_STATUS_ACCESS_DENIED
;
1748 if (!pdb_getgrsid(&map
, info
->sid
))
1749 return NT_STATUS_NO_SUCH_GROUP
;
1751 return pdb_update_group_mapping_entry(&map
);
1754 /***************************************************************************
1755 _lsa_AddPrivilegesToAccount
1756 For a given SID, add some privileges.
1757 ***************************************************************************/
1759 NTSTATUS
_lsa_AddPrivilegesToAccount(pipes_struct
*p
,
1760 struct lsa_AddPrivilegesToAccount
*r
)
1762 struct lsa_info
*info
= NULL
;
1764 struct lsa_PrivilegeSet
*set
= NULL
;
1766 /* find the connection policy handle. */
1767 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
1768 return NT_STATUS_INVALID_HANDLE
;
1770 /* check to see if the pipe_user is root or a Domain Admin since
1771 account_pol.tdb was already opened as root, this is all we have */
1773 if ( p
->server_info
->utok
.uid
!= sec_initial_uid()
1774 && !nt_token_check_domain_rid( p
->server_info
->ptok
,
1775 DOMAIN_GROUP_RID_ADMINS
) )
1777 return NT_STATUS_ACCESS_DENIED
;
1781 if ( !privilege_set_to_se_priv( &mask
, set
) )
1782 return NT_STATUS_NO_SUCH_PRIVILEGE
;
1784 if ( !grant_privilege( &info
->sid
, &mask
) ) {
1785 DEBUG(3,("_lsa_AddPrivilegesToAccount: grant_privilege(%s) failed!\n",
1786 sid_string_dbg(&info
->sid
) ));
1787 DEBUG(3,("Privilege mask:\n"));
1788 dump_se_priv( DBGC_ALL
, 3, &mask
);
1789 return NT_STATUS_NO_SUCH_PRIVILEGE
;
1792 return NT_STATUS_OK
;
1795 /***************************************************************************
1796 _lsa_RemovePrivilegesFromAccount
1797 For a given SID, remove some privileges.
1798 ***************************************************************************/
1800 NTSTATUS
_lsa_RemovePrivilegesFromAccount(pipes_struct
*p
,
1801 struct lsa_RemovePrivilegesFromAccount
*r
)
1803 struct lsa_info
*info
= NULL
;
1805 struct lsa_PrivilegeSet
*set
= NULL
;
1807 /* find the connection policy handle. */
1808 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
1809 return NT_STATUS_INVALID_HANDLE
;
1811 /* check to see if the pipe_user is root or a Domain Admin since
1812 account_pol.tdb was already opened as root, this is all we have */
1814 if ( p
->server_info
->utok
.uid
!= sec_initial_uid()
1815 && !nt_token_check_domain_rid( p
->server_info
->ptok
,
1816 DOMAIN_GROUP_RID_ADMINS
) )
1818 return NT_STATUS_ACCESS_DENIED
;
1823 if ( !privilege_set_to_se_priv( &mask
, set
) )
1824 return NT_STATUS_NO_SUCH_PRIVILEGE
;
1826 if ( !revoke_privilege( &info
->sid
, &mask
) ) {
1827 DEBUG(3,("_lsa_RemovePrivilegesFromAccount: revoke_privilege(%s) failed!\n",
1828 sid_string_dbg(&info
->sid
) ));
1829 DEBUG(3,("Privilege mask:\n"));
1830 dump_se_priv( DBGC_ALL
, 3, &mask
);
1831 return NT_STATUS_NO_SUCH_PRIVILEGE
;
1834 return NT_STATUS_OK
;
1837 /***************************************************************************
1839 ***************************************************************************/
1841 NTSTATUS
_lsa_QuerySecurity(pipes_struct
*p
,
1842 struct lsa_QuerySecurity
*r
)
1844 struct lsa_info
*handle
=NULL
;
1845 SEC_DESC
*psd
= NULL
;
1849 /* find the connection policy handle. */
1850 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&handle
))
1851 return NT_STATUS_INVALID_HANDLE
;
1853 /* check if the user has enough rights */
1854 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
1855 return NT_STATUS_ACCESS_DENIED
;
1857 switch (r
->in
.sec_info
) {
1859 /* SD contains only the owner */
1861 status
=lsa_get_generic_sd(p
->mem_ctx
, &psd
, &sd_size
);
1862 if(!NT_STATUS_IS_OK(status
))
1863 return NT_STATUS_NO_MEMORY
;
1866 if((*r
->out
.sdbuf
= make_sec_desc_buf(p
->mem_ctx
, sd_size
, psd
)) == NULL
)
1867 return NT_STATUS_NO_MEMORY
;
1870 /* SD contains only the ACL */
1872 status
=lsa_get_generic_sd(p
->mem_ctx
, &psd
, &sd_size
);
1873 if(!NT_STATUS_IS_OK(status
))
1874 return NT_STATUS_NO_MEMORY
;
1876 if((*r
->out
.sdbuf
= make_sec_desc_buf(p
->mem_ctx
, sd_size
, psd
)) == NULL
)
1877 return NT_STATUS_NO_MEMORY
;
1880 return NT_STATUS_INVALID_LEVEL
;
1886 #if 0 /* AD DC work in ongoing in Samba 4 */
1888 /***************************************************************************
1889 ***************************************************************************/
1891 NTSTATUS
_lsa_query_info2(pipes_struct
*p
, LSA_Q_QUERY_INFO2
*q_u
, LSA_R_QUERY_INFO2
*r_u
)
1893 struct lsa_info
*handle
;
1894 const char *nb_name
;
1895 char *dns_name
= NULL
;
1896 char *forest_name
= NULL
;
1897 DOM_SID
*sid
= NULL
;
1902 r_u
->status
= NT_STATUS_OK
;
1904 if (!find_policy_by_hnd(p
, &q_u
->pol
, (void **)(void *)&handle
))
1905 return NT_STATUS_INVALID_HANDLE
;
1907 switch (q_u
->info_class
) {
1909 /* check if the user has enough rights */
1910 if (!(handle
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
1911 return NT_STATUS_ACCESS_DENIED
;
1913 /* Request PolicyPrimaryDomainInformation. */
1914 switch (lp_server_role()) {
1915 case ROLE_DOMAIN_PDC
:
1916 case ROLE_DOMAIN_BDC
:
1917 nb_name
= get_global_sam_name();
1918 /* ugly temp hack for these next two */
1920 /* This should be a 'netbios domain -> DNS domain' mapping */
1921 dnsdomname
= get_mydnsdomname(p
->mem_ctx
);
1922 if (!dnsdomname
|| !*dnsdomname
) {
1923 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO
;
1925 strlower_m(dnsdomname
);
1927 dns_name
= dnsdomname
;
1928 forest_name
= dnsdomname
;
1930 sid
= get_global_sam_sid();
1931 secrets_fetch_domain_guid(lp_workgroup(), &guid
);
1934 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO
;
1936 init_dns_dom_info(&r_u
->info
.dns_dom_info
, nb_name
, dns_name
,
1937 forest_name
,&guid
,sid
);
1940 DEBUG(0,("_lsa_query_info2: unknown info level in Lsa Query: %d\n", q_u
->info_class
));
1941 r_u
->status
= NT_STATUS_INVALID_INFO_CLASS
;
1945 if (NT_STATUS_IS_OK(r_u
->status
)) {
1947 r_u
->info_class
= q_u
->info_class
;
1952 #endif /* AD DC work in ongoing in Samba 4 */
1954 /***************************************************************************
1955 _lsa_AddAccountRights
1956 ***************************************************************************/
1958 NTSTATUS
_lsa_AddAccountRights(pipes_struct
*p
,
1959 struct lsa_AddAccountRights
*r
)
1961 struct lsa_info
*info
= NULL
;
1965 /* find the connection policy handle. */
1966 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
1967 return NT_STATUS_INVALID_HANDLE
;
1969 /* check to see if the pipe_user is a Domain Admin since
1970 account_pol.tdb was already opened as root, this is all we have */
1972 if ( p
->server_info
->utok
.uid
!= sec_initial_uid()
1973 && !nt_token_check_domain_rid( p
->server_info
->ptok
,
1974 DOMAIN_GROUP_RID_ADMINS
) )
1976 return NT_STATUS_ACCESS_DENIED
;
1979 /* according to an NT4 PDC, you can add privileges to SIDs even without
1980 call_lsa_create_account() first. And you can use any arbitrary SID. */
1982 sid_copy( &sid
, r
->in
.sid
);
1984 for ( i
=0; i
< r
->in
.rights
->count
; i
++ ) {
1986 const char *privname
= r
->in
.rights
->names
[i
].string
;
1988 /* only try to add non-null strings */
1993 if ( !grant_privilege_by_name( &sid
, privname
) ) {
1994 DEBUG(2,("_lsa_AddAccountRights: Failed to add privilege [%s]\n",
1996 return NT_STATUS_NO_SUCH_PRIVILEGE
;
2000 return NT_STATUS_OK
;
2003 /***************************************************************************
2004 _lsa_RemoveAccountRights
2005 ***************************************************************************/
2007 NTSTATUS
_lsa_RemoveAccountRights(pipes_struct
*p
,
2008 struct lsa_RemoveAccountRights
*r
)
2010 struct lsa_info
*info
= NULL
;
2013 const char *privname
= NULL
;
2015 /* find the connection policy handle. */
2016 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
2017 return NT_STATUS_INVALID_HANDLE
;
2019 /* check to see if the pipe_user is a Domain Admin since
2020 account_pol.tdb was already opened as root, this is all we have */
2022 if ( p
->server_info
->utok
.uid
!= sec_initial_uid()
2023 && !nt_token_check_domain_rid( p
->server_info
->ptok
,
2024 DOMAIN_GROUP_RID_ADMINS
) )
2026 return NT_STATUS_ACCESS_DENIED
;
2029 sid_copy( &sid
, r
->in
.sid
);
2031 if ( r
->in
.remove_all
) {
2032 if ( !revoke_all_privileges( &sid
) )
2033 return NT_STATUS_ACCESS_DENIED
;
2035 return NT_STATUS_OK
;
2038 for ( i
=0; i
< r
->in
.rights
->count
; i
++ ) {
2040 privname
= r
->in
.rights
->names
[i
].string
;
2042 /* only try to add non-null strings */
2047 if ( !revoke_privilege_by_name( &sid
, privname
) ) {
2048 DEBUG(2,("_lsa_RemoveAccountRights: Failed to revoke privilege [%s]\n",
2050 return NT_STATUS_NO_SUCH_PRIVILEGE
;
2054 return NT_STATUS_OK
;
2057 /*******************************************************************
2058 ********************************************************************/
2060 static NTSTATUS
init_lsa_right_set(TALLOC_CTX
*mem_ctx
,
2061 struct lsa_RightSet
*r
,
2062 PRIVILEGE_SET
*privileges
)
2065 const char *privname
;
2066 const char **privname_array
= NULL
;
2069 for (i
=0; i
<privileges
->count
; i
++) {
2071 privname
= luid_to_privilege_name(&privileges
->set
[i
].luid
);
2073 if (!add_string_to_array(mem_ctx
, privname
,
2074 &privname_array
, &num_priv
)) {
2075 return NT_STATUS_NO_MEMORY
;
2082 r
->names
= TALLOC_ZERO_ARRAY(mem_ctx
, struct lsa_StringLarge
,
2085 return NT_STATUS_NO_MEMORY
;
2088 for (i
=0; i
<num_priv
; i
++) {
2089 init_lsa_StringLarge(&r
->names
[i
], privname_array
[i
]);
2092 r
->count
= num_priv
;
2095 return NT_STATUS_OK
;
2098 /***************************************************************************
2099 _lsa_EnumAccountRights
2100 ***************************************************************************/
2102 NTSTATUS
_lsa_EnumAccountRights(pipes_struct
*p
,
2103 struct lsa_EnumAccountRights
*r
)
2106 struct lsa_info
*info
= NULL
;
2108 PRIVILEGE_SET privileges
;
2111 /* find the connection policy handle. */
2113 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
2114 return NT_STATUS_INVALID_HANDLE
;
2116 if (!(info
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
2117 return NT_STATUS_ACCESS_DENIED
;
2119 /* according to an NT4 PDC, you can add privileges to SIDs even without
2120 call_lsa_create_account() first. And you can use any arbitrary SID. */
2122 sid_copy( &sid
, r
->in
.sid
);
2124 if ( !get_privileges_for_sids( &mask
, &sid
, 1 ) )
2125 return NT_STATUS_OBJECT_NAME_NOT_FOUND
;
2127 privilege_set_init( &privileges
);
2129 if ( se_priv_to_privilege_set( &privileges
, &mask
) ) {
2131 DEBUG(10,("_lsa_EnumAccountRights: %s has %d privileges\n",
2132 sid_string_dbg(&sid
), privileges
.count
));
2134 status
= init_lsa_right_set(p
->mem_ctx
, r
->out
.rights
, &privileges
);
2136 status
= NT_STATUS_NO_SUCH_PRIVILEGE
;
2139 privilege_set_free( &privileges
);
2144 /***************************************************************************
2145 _lsa_LookupPrivValue
2146 ***************************************************************************/
2148 NTSTATUS
_lsa_LookupPrivValue(pipes_struct
*p
,
2149 struct lsa_LookupPrivValue
*r
)
2151 struct lsa_info
*info
= NULL
;
2152 const char *name
= NULL
;
2153 LUID_ATTR priv_luid
;
2156 /* find the connection policy handle. */
2158 if (!find_policy_by_hnd(p
, r
->in
.handle
, (void **)(void *)&info
))
2159 return NT_STATUS_INVALID_HANDLE
;
2161 if (!(info
->access
& LSA_POLICY_VIEW_LOCAL_INFORMATION
))
2162 return NT_STATUS_ACCESS_DENIED
;
2164 name
= r
->in
.name
->string
;
2166 DEBUG(10,("_lsa_lookup_priv_value: name = %s\n", name
));
2168 if ( !se_priv_from_name( name
, &mask
) )
2169 return NT_STATUS_NO_SUCH_PRIVILEGE
;
2171 priv_luid
= get_privilege_luid( &mask
);
2173 r
->out
.luid
->low
= priv_luid
.luid
.low
;
2174 r
->out
.luid
->high
= priv_luid
.luid
.high
;
2176 return NT_STATUS_OK
;
2180 * From here on the server routines are just dummy ones to make smbd link with
2181 * librpc/gen_ndr/srv_lsa.c. These routines are actually never called, we are
2182 * pulling the server stubs across one by one.
2185 NTSTATUS
_lsa_Delete(pipes_struct
*p
, struct lsa_Delete
*r
)
2187 p
->rng_fault_state
= True
;
2188 return NT_STATUS_NOT_IMPLEMENTED
;
2191 NTSTATUS
_lsa_SetSecObj(pipes_struct
*p
, struct lsa_SetSecObj
*r
)
2193 p
->rng_fault_state
= True
;
2194 return NT_STATUS_NOT_IMPLEMENTED
;
2197 NTSTATUS
_lsa_ChangePassword(pipes_struct
*p
, struct lsa_ChangePassword
*r
)
2199 p
->rng_fault_state
= True
;
2200 return NT_STATUS_NOT_IMPLEMENTED
;
2203 NTSTATUS
_lsa_SetInfoPolicy(pipes_struct
*p
, struct lsa_SetInfoPolicy
*r
)
2205 p
->rng_fault_state
= True
;
2206 return NT_STATUS_NOT_IMPLEMENTED
;
2209 NTSTATUS
_lsa_ClearAuditLog(pipes_struct
*p
, struct lsa_ClearAuditLog
*r
)
2211 p
->rng_fault_state
= True
;
2212 return NT_STATUS_NOT_IMPLEMENTED
;
2215 NTSTATUS
_lsa_GetQuotasForAccount(pipes_struct
*p
, struct lsa_GetQuotasForAccount
*r
)
2217 p
->rng_fault_state
= True
;
2218 return NT_STATUS_NOT_IMPLEMENTED
;
2221 NTSTATUS
_lsa_SetQuotasForAccount(pipes_struct
*p
, struct lsa_SetQuotasForAccount
*r
)
2223 p
->rng_fault_state
= True
;
2224 return NT_STATUS_NOT_IMPLEMENTED
;
2227 NTSTATUS
_lsa_QueryTrustedDomainInfo(pipes_struct
*p
, struct lsa_QueryTrustedDomainInfo
*r
)
2229 p
->rng_fault_state
= True
;
2230 return NT_STATUS_NOT_IMPLEMENTED
;
2233 NTSTATUS
_lsa_SetInformationTrustedDomain(pipes_struct
*p
, struct lsa_SetInformationTrustedDomain
*r
)
2235 p
->rng_fault_state
= True
;
2236 return NT_STATUS_NOT_IMPLEMENTED
;
2239 NTSTATUS
_lsa_QuerySecret(pipes_struct
*p
, struct lsa_QuerySecret
*r
)
2241 p
->rng_fault_state
= True
;
2242 return NT_STATUS_NOT_IMPLEMENTED
;
2245 NTSTATUS
_lsa_LookupPrivName(pipes_struct
*p
, struct lsa_LookupPrivName
*r
)
2247 p
->rng_fault_state
= True
;
2248 return NT_STATUS_NOT_IMPLEMENTED
;
2251 NTSTATUS
_lsa_EnumAccountsWithUserRight(pipes_struct
*p
, struct lsa_EnumAccountsWithUserRight
*r
)
2253 p
->rng_fault_state
= True
;
2254 return NT_STATUS_NOT_IMPLEMENTED
;
2257 NTSTATUS
_lsa_QueryTrustedDomainInfoBySid(pipes_struct
*p
, struct lsa_QueryTrustedDomainInfoBySid
*r
)
2259 p
->rng_fault_state
= True
;
2260 return NT_STATUS_NOT_IMPLEMENTED
;
2263 NTSTATUS
_lsa_SetTrustedDomainInfo(pipes_struct
*p
, struct lsa_SetTrustedDomainInfo
*r
)
2265 p
->rng_fault_state
= True
;
2266 return NT_STATUS_NOT_IMPLEMENTED
;
2269 NTSTATUS
_lsa_DeleteTrustedDomain(pipes_struct
*p
, struct lsa_DeleteTrustedDomain
*r
)
2271 p
->rng_fault_state
= True
;
2272 return NT_STATUS_NOT_IMPLEMENTED
;
2275 NTSTATUS
_lsa_StorePrivateData(pipes_struct
*p
, struct lsa_StorePrivateData
*r
)
2277 p
->rng_fault_state
= True
;
2278 return NT_STATUS_NOT_IMPLEMENTED
;
2281 NTSTATUS
_lsa_RetrievePrivateData(pipes_struct
*p
, struct lsa_RetrievePrivateData
*r
)
2283 p
->rng_fault_state
= True
;
2284 return NT_STATUS_NOT_IMPLEMENTED
;
2287 NTSTATUS
_lsa_QueryInfoPolicy2(pipes_struct
*p
, struct lsa_QueryInfoPolicy2
*r
)
2289 p
->rng_fault_state
= True
;
2290 return NT_STATUS_NOT_IMPLEMENTED
;
2293 NTSTATUS
_lsa_SetInfoPolicy2(pipes_struct
*p
, struct lsa_SetInfoPolicy2
*r
)
2295 p
->rng_fault_state
= True
;
2296 return NT_STATUS_NOT_IMPLEMENTED
;
2299 NTSTATUS
_lsa_QueryTrustedDomainInfoByName(pipes_struct
*p
, struct lsa_QueryTrustedDomainInfoByName
*r
)
2301 p
->rng_fault_state
= True
;
2302 return NT_STATUS_NOT_IMPLEMENTED
;
2305 NTSTATUS
_lsa_SetTrustedDomainInfoByName(pipes_struct
*p
, struct lsa_SetTrustedDomainInfoByName
*r
)
2307 p
->rng_fault_state
= True
;
2308 return NT_STATUS_NOT_IMPLEMENTED
;
2311 NTSTATUS
_lsa_EnumTrustedDomainsEx(pipes_struct
*p
, struct lsa_EnumTrustedDomainsEx
*r
)
2313 p
->rng_fault_state
= True
;
2314 return NT_STATUS_NOT_IMPLEMENTED
;
2317 NTSTATUS
_lsa_CreateTrustedDomainEx(pipes_struct
*p
, struct lsa_CreateTrustedDomainEx
*r
)
2319 p
->rng_fault_state
= True
;
2320 return NT_STATUS_NOT_IMPLEMENTED
;
2323 NTSTATUS
_lsa_CloseTrustedDomainEx(pipes_struct
*p
, struct lsa_CloseTrustedDomainEx
*r
)
2325 p
->rng_fault_state
= True
;
2326 return NT_STATUS_NOT_IMPLEMENTED
;
2329 NTSTATUS
_lsa_QueryDomainInformationPolicy(pipes_struct
*p
, struct lsa_QueryDomainInformationPolicy
*r
)
2331 p
->rng_fault_state
= True
;
2332 return NT_STATUS_NOT_IMPLEMENTED
;
2335 NTSTATUS
_lsa_SetDomainInformationPolicy(pipes_struct
*p
, struct lsa_SetDomainInformationPolicy
*r
)
2337 p
->rng_fault_state
= True
;
2338 return NT_STATUS_NOT_IMPLEMENTED
;
2341 NTSTATUS
_lsa_OpenTrustedDomainByName(pipes_struct
*p
, struct lsa_OpenTrustedDomainByName
*r
)
2343 p
->rng_fault_state
= True
;
2344 return NT_STATUS_NOT_IMPLEMENTED
;
2347 NTSTATUS
_lsa_TestCall(pipes_struct
*p
, struct lsa_TestCall
*r
)
2349 p
->rng_fault_state
= True
;
2350 return NT_STATUS_NOT_IMPLEMENTED
;
2353 NTSTATUS
_lsa_CreateTrustedDomainEx2(pipes_struct
*p
, struct lsa_CreateTrustedDomainEx2
*r
)
2355 p
->rng_fault_state
= True
;
2356 return NT_STATUS_NOT_IMPLEMENTED
;
2359 NTSTATUS
_lsa_CREDRWRITE(pipes_struct
*p
, struct lsa_CREDRWRITE
*r
)
2361 p
->rng_fault_state
= True
;
2362 return NT_STATUS_NOT_IMPLEMENTED
;
2365 NTSTATUS
_lsa_CREDRREAD(pipes_struct
*p
, struct lsa_CREDRREAD
*r
)
2367 p
->rng_fault_state
= True
;
2368 return NT_STATUS_NOT_IMPLEMENTED
;
2371 NTSTATUS
_lsa_CREDRENUMERATE(pipes_struct
*p
, struct lsa_CREDRENUMERATE
*r
)
2373 p
->rng_fault_state
= True
;
2374 return NT_STATUS_NOT_IMPLEMENTED
;
2377 NTSTATUS
_lsa_CREDRWRITEDOMAINCREDENTIALS(pipes_struct
*p
, struct lsa_CREDRWRITEDOMAINCREDENTIALS
*r
)
2379 p
->rng_fault_state
= True
;
2380 return NT_STATUS_NOT_IMPLEMENTED
;
2383 NTSTATUS
_lsa_CREDRREADDOMAINCREDENTIALS(pipes_struct
*p
, struct lsa_CREDRREADDOMAINCREDENTIALS
*r
)
2385 p
->rng_fault_state
= True
;
2386 return NT_STATUS_NOT_IMPLEMENTED
;
2389 NTSTATUS
_lsa_CREDRDELETE(pipes_struct
*p
, struct lsa_CREDRDELETE
*r
)
2391 p
->rng_fault_state
= True
;
2392 return NT_STATUS_NOT_IMPLEMENTED
;
2395 NTSTATUS
_lsa_CREDRGETTARGETINFO(pipes_struct
*p
, struct lsa_CREDRGETTARGETINFO
*r
)
2397 p
->rng_fault_state
= True
;
2398 return NT_STATUS_NOT_IMPLEMENTED
;
2401 NTSTATUS
_lsa_CREDRPROFILELOADED(pipes_struct
*p
, struct lsa_CREDRPROFILELOADED
*r
)
2403 p
->rng_fault_state
= True
;
2404 return NT_STATUS_NOT_IMPLEMENTED
;
2407 NTSTATUS
_lsa_CREDRGETSESSIONTYPES(pipes_struct
*p
, struct lsa_CREDRGETSESSIONTYPES
*r
)
2409 p
->rng_fault_state
= True
;
2410 return NT_STATUS_NOT_IMPLEMENTED
;
2413 NTSTATUS
_lsa_LSARREGISTERAUDITEVENT(pipes_struct
*p
, struct lsa_LSARREGISTERAUDITEVENT
*r
)
2415 p
->rng_fault_state
= True
;
2416 return NT_STATUS_NOT_IMPLEMENTED
;
2419 NTSTATUS
_lsa_LSARGENAUDITEVENT(pipes_struct
*p
, struct lsa_LSARGENAUDITEVENT
*r
)
2421 p
->rng_fault_state
= True
;
2422 return NT_STATUS_NOT_IMPLEMENTED
;
2425 NTSTATUS
_lsa_LSARUNREGISTERAUDITEVENT(pipes_struct
*p
, struct lsa_LSARUNREGISTERAUDITEVENT
*r
)
2427 p
->rng_fault_state
= True
;
2428 return NT_STATUS_NOT_IMPLEMENTED
;
2431 NTSTATUS
_lsa_lsaRQueryForestTrustInformation(pipes_struct
*p
, struct lsa_lsaRQueryForestTrustInformation
*r
)
2433 p
->rng_fault_state
= True
;
2434 return NT_STATUS_NOT_IMPLEMENTED
;
2437 NTSTATUS
_lsa_LSARSETFORESTTRUSTINFORMATION(pipes_struct
*p
, struct lsa_LSARSETFORESTTRUSTINFORMATION
*r
)
2439 p
->rng_fault_state
= True
;
2440 return NT_STATUS_NOT_IMPLEMENTED
;
2443 NTSTATUS
_lsa_CREDRRENAME(pipes_struct
*p
, struct lsa_CREDRRENAME
*r
)
2445 p
->rng_fault_state
= True
;
2446 return NT_STATUS_NOT_IMPLEMENTED
;
2449 NTSTATUS
_lsa_LSAROPENPOLICYSCE(pipes_struct
*p
, struct lsa_LSAROPENPOLICYSCE
*r
)
2451 p
->rng_fault_state
= True
;
2452 return NT_STATUS_NOT_IMPLEMENTED
;
2455 NTSTATUS
_lsa_LSARADTREGISTERSECURITYEVENTSOURCE(pipes_struct
*p
, struct lsa_LSARADTREGISTERSECURITYEVENTSOURCE
*r
)
2457 p
->rng_fault_state
= True
;
2458 return NT_STATUS_NOT_IMPLEMENTED
;
2461 NTSTATUS
_lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(pipes_struct
*p
, struct lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE
*r
)
2463 p
->rng_fault_state
= True
;
2464 return NT_STATUS_NOT_IMPLEMENTED
;
2467 NTSTATUS
_lsa_LSARADTREPORTSECURITYEVENT(pipes_struct
*p
, struct lsa_LSARADTREPORTSECURITYEVENT
*r
)
2469 p
->rng_fault_state
= True
;
2470 return NT_STATUS_NOT_IMPLEMENTED
;