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. */
32 #include "../librpc/gen_ndr/srv_lsa.h"
36 #define DBGC_CLASS DBGC_RPC_SRV
38 #define MAX_LOOKUP_SIDS 0x5000 /* 20480 */
42 enum lsa_handle_type { LSA_HANDLE_POLICY_TYPE = 1, LSA_HANDLE_ACCOUNT_TYPE };
48 enum lsa_handle_type type;
49 struct security_descriptor *sd;
52 const struct generic_mapping lsa_account_mapping = {
56 LSA_ACCOUNT_ALL_ACCESS
59 const struct generic_mapping lsa_policy_mapping = {
66 const struct generic_mapping lsa_secret_mapping = {
73 const struct generic_mapping lsa_trusted_domain_mapping = {
74 LSA_TRUSTED_DOMAIN_READ,
75 LSA_TRUSTED_DOMAIN_WRITE,
76 LSA_TRUSTED_DOMAIN_EXECUTE,
77 LSA_TRUSTED_DOMAIN_ALL_ACCESS
80 /***************************************************************************
81 init_lsa_ref_domain_list - adds a domain if it's not already in, returns the index.
82 ***************************************************************************/
84 static int init_lsa_ref_domain_list(TALLOC_CTX *mem_ctx,
85 struct lsa_RefDomainList *ref,
87 struct dom_sid *dom_sid)
91 if (dom_name != NULL) {
92 for (num = 0; num < ref->count; num++) {
93 if (sid_equal(dom_sid, ref->domains[num].sid)) {
101 if (num >= LSA_REF_DOMAIN_LIST_MULTIPLIER) {
102 /* index not found, already at maximum domain limit */
106 ref->count = num + 1;
107 ref->max_size = LSA_REF_DOMAIN_LIST_MULTIPLIER;
109 ref->domains = TALLOC_REALLOC_ARRAY(mem_ctx, ref->domains,
110 struct lsa_DomainInfo, ref->count);
115 ZERO_STRUCT(ref->domains[num]);
117 init_lsa_StringLarge(&ref->domains[num].name, dom_name);
118 ref->domains[num].sid = sid_dup_talloc(mem_ctx, dom_sid);
119 if (!ref->domains[num].sid) {
127 /***************************************************************************
128 initialize a lsa_DomainInfo structure.
129 ***************************************************************************/
131 static void init_dom_query_3(struct lsa_DomainInfo *r,
135 init_lsa_StringLarge(&r->name, name);
139 /***************************************************************************
140 initialize a lsa_DomainInfo structure.
141 ***************************************************************************/
143 static void init_dom_query_5(struct lsa_DomainInfo *r,
147 init_lsa_StringLarge(&r->name, name);
151 /***************************************************************************
152 lookup_lsa_rids. Must be called as root for lookup_name to work.
153 ***************************************************************************/
155 static NTSTATUS lookup_lsa_rids(TALLOC_CTX *mem_ctx,
156 struct lsa_RefDomainList *ref,
157 struct lsa_TranslatedSid *prid,
158 uint32_t num_entries,
159 struct lsa_String *name,
161 uint32_t *pmapped_count)
163 uint32 mapped_count, i;
165 SMB_ASSERT(num_entries <= MAX_LOOKUP_SIDS);
170 for (i = 0; i < num_entries; i++) {
174 const char *full_name;
176 enum lsa_SidType type = SID_NAME_UNKNOWN;
178 /* Split name into domain and user component */
180 /* follow w2k8 behavior and return the builtin domain when no
181 * input has been passed in */
183 if (name[i].string) {
184 full_name = name[i].string;
186 full_name = "BUILTIN";
189 DEBUG(5, ("lookup_lsa_rids: looking up name %s\n", full_name));
191 /* We can ignore the result of lookup_name, it will not touch
192 "type" if it's not successful */
194 lookup_name(mem_ctx, full_name, flags, &domain, NULL,
199 case SID_NAME_DOM_GRP:
200 case SID_NAME_DOMAIN:
202 case SID_NAME_WKN_GRP:
203 DEBUG(5, ("init_lsa_rids: %s found\n", full_name));
204 /* Leave these unchanged */
207 /* Don't hand out anything but the list above */
208 DEBUG(5, ("init_lsa_rids: %s not found\n", full_name));
209 type = SID_NAME_UNKNOWN;
216 if (type != SID_NAME_UNKNOWN) {
217 if (type == SID_NAME_DOMAIN) {
220 sid_split_rid(&sid, &rid);
222 dom_idx = init_lsa_ref_domain_list(mem_ctx, ref, domain, &sid);
226 prid[i].sid_type = type;
228 prid[i].sid_index = dom_idx;
231 *pmapped_count = mapped_count;
235 /***************************************************************************
236 lookup_lsa_sids. Must be called as root for lookup_name to work.
237 ***************************************************************************/
239 static NTSTATUS lookup_lsa_sids(TALLOC_CTX *mem_ctx,
240 struct lsa_RefDomainList *ref,
241 struct lsa_TranslatedSid3 *trans_sids,
242 uint32_t num_entries,
243 struct lsa_String *name,
245 uint32 *pmapped_count)
247 uint32 mapped_count, i;
249 SMB_ASSERT(num_entries <= MAX_LOOKUP_SIDS);
254 for (i = 0; i < num_entries; i++) {
258 const char *full_name;
260 enum lsa_SidType type = SID_NAME_UNKNOWN;
264 /* Split name into domain and user component */
266 full_name = name[i].string;
267 if (full_name == NULL) {
268 return NT_STATUS_NO_MEMORY;
271 DEBUG(5, ("init_lsa_sids: looking up name %s\n", full_name));
273 /* We can ignore the result of lookup_name, it will not touch
274 "type" if it's not successful */
276 lookup_name(mem_ctx, full_name, flags, &domain, NULL,
281 case SID_NAME_DOM_GRP:
282 case SID_NAME_DOMAIN:
284 case SID_NAME_WKN_GRP:
285 DEBUG(5, ("init_lsa_sids: %s found\n", full_name));
286 /* Leave these unchanged */
289 /* Don't hand out anything but the list above */
290 DEBUG(5, ("init_lsa_sids: %s not found\n", full_name));
291 type = SID_NAME_UNKNOWN;
298 if (type != SID_NAME_UNKNOWN) {
299 struct dom_sid domain_sid;
300 sid_copy(&domain_sid, &sid);
301 sid_split_rid(&domain_sid, &rid);
302 dom_idx = init_lsa_ref_domain_list(mem_ctx, ref, domain, &domain_sid);
306 /* Initialize the lsa_TranslatedSid3 return. */
307 trans_sids[i].sid_type = type;
308 trans_sids[i].sid = sid_dup_talloc(mem_ctx, &sid);
309 trans_sids[i].sid_index = dom_idx;
312 *pmapped_count = mapped_count;
316 static NTSTATUS make_lsa_object_sd(TALLOC_CTX *mem_ctx, struct security_descriptor **sd, size_t *sd_size,
317 const struct generic_mapping *map,
318 struct dom_sid *sid, uint32_t sid_access)
320 struct dom_sid adm_sid;
321 struct security_ace ace[5];
324 struct security_acl *psa = NULL;
326 /* READ|EXECUTE access for Everyone */
328 init_sec_ace(&ace[i++], &global_sid_World, SEC_ACE_TYPE_ACCESS_ALLOWED,
329 map->generic_execute | map->generic_read, 0);
331 /* Add Full Access 'BUILTIN\Administrators' and 'BUILTIN\Account Operators */
333 init_sec_ace(&ace[i++], &global_sid_Builtin_Administrators,
334 SEC_ACE_TYPE_ACCESS_ALLOWED, map->generic_all, 0);
335 init_sec_ace(&ace[i++], &global_sid_Builtin_Account_Operators,
336 SEC_ACE_TYPE_ACCESS_ALLOWED, map->generic_all, 0);
338 /* Add Full Access for Domain Admins */
339 sid_compose(&adm_sid, get_global_sam_sid(), DOMAIN_RID_ADMINS);
340 init_sec_ace(&ace[i++], &adm_sid, SEC_ACE_TYPE_ACCESS_ALLOWED,
341 map->generic_all, 0);
343 /* If we have a sid, give it some special access */
346 init_sec_ace(&ace[i++], sid, SEC_ACE_TYPE_ACCESS_ALLOWED,
350 if((psa = make_sec_acl(mem_ctx, NT4_ACL_REVISION, i, ace)) == NULL)
351 return NT_STATUS_NO_MEMORY;
353 if((*sd = make_sec_desc(mem_ctx, SECURITY_DESCRIPTOR_REVISION_1,
354 SEC_DESC_SELF_RELATIVE, &adm_sid, NULL, NULL,
355 psa, sd_size)) == NULL)
356 return NT_STATUS_NO_MEMORY;
362 /***************************************************************************
364 ***************************************************************************/
366 NTSTATUS _lsa_OpenPolicy2(struct pipes_struct *p,
367 struct lsa_OpenPolicy2 *r)
369 struct lsa_info *info;
370 struct security_descriptor *psd = NULL;
372 uint32 des_access = r->in.access_mask;
376 /* Work out max allowed. */
377 map_max_allowed_access(p->server_info->ptok,
378 &p->server_info->utok,
381 /* map the generic bits to the lsa policy ones */
382 se_map_generic(&des_access, &lsa_policy_mapping);
384 /* get the generic lsa policy SD until we store it */
385 status = make_lsa_object_sd(p->mem_ctx, &psd, &sd_size, &lsa_policy_mapping,
387 if (!NT_STATUS_IS_OK(status)) {
391 status = access_check_object(psd, p->server_info->ptok,
393 &acc_granted, "_lsa_OpenPolicy2" );
394 if (!NT_STATUS_IS_OK(status)) {
398 /* associate the domain SID with the (unique) handle. */
399 info = TALLOC_ZERO_P(p->mem_ctx, struct lsa_info);
401 return NT_STATUS_NO_MEMORY;
404 sid_copy(&info->sid,get_global_sam_sid());
405 info->access = acc_granted;
406 info->type = LSA_HANDLE_POLICY_TYPE;
408 /* set up the LSA QUERY INFO response */
409 if (!create_policy_hnd(p, r->out.handle, info))
410 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
415 /***************************************************************************
417 ***************************************************************************/
419 NTSTATUS _lsa_OpenPolicy(struct pipes_struct *p,
420 struct lsa_OpenPolicy *r)
422 struct lsa_OpenPolicy2 o;
424 o.in.system_name = NULL; /* should be ignored */
425 o.in.attr = r->in.attr;
426 o.in.access_mask = r->in.access_mask;
428 o.out.handle = r->out.handle;
430 return _lsa_OpenPolicy2(p, &o);
433 /***************************************************************************
434 _lsa_EnumTrustDom - this needs fixing to do more than return NULL ! JRA.
436 ***************************************************************************/
438 NTSTATUS _lsa_EnumTrustDom(struct pipes_struct *p,
439 struct lsa_EnumTrustDom *r)
441 struct lsa_info *info;
443 struct trustdom_info **domains;
444 struct lsa_DomainInfo *entries;
448 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
449 return NT_STATUS_INVALID_HANDLE;
451 if (info->type != LSA_HANDLE_POLICY_TYPE) {
452 return NT_STATUS_INVALID_HANDLE;
455 /* check if the user has enough rights */
456 if (!(info->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
457 return NT_STATUS_ACCESS_DENIED;
460 nt_status = pdb_enum_trusteddoms(p->mem_ctx, &count, &domains);
463 if (!NT_STATUS_IS_OK(nt_status)) {
467 entries = TALLOC_ZERO_ARRAY(p->mem_ctx, struct lsa_DomainInfo, count);
469 return NT_STATUS_NO_MEMORY;
472 for (i=0; i<count; i++) {
473 init_lsa_StringLarge(&entries[i].name, domains[i]->name);
474 entries[i].sid = &domains[i]->sid;
477 if (*r->in.resume_handle >= count) {
478 *r->out.resume_handle = -1;
479 TALLOC_FREE(entries);
480 return NT_STATUS_NO_MORE_ENTRIES;
483 /* return the rest, limit by max_size. Note that we
484 use the w2k3 element size value of 60 */
485 r->out.domains->count = count - *r->in.resume_handle;
486 r->out.domains->count = MIN(r->out.domains->count,
487 1+(r->in.max_size/LSA_ENUM_TRUST_DOMAIN_MULTIPLIER));
489 r->out.domains->domains = entries + *r->in.resume_handle;
491 if (r->out.domains->count < count - *r->in.resume_handle) {
492 *r->out.resume_handle = *r->in.resume_handle + r->out.domains->count;
493 return STATUS_MORE_ENTRIES;
496 /* according to MS-LSAD 3.1.4.7.8 output resume handle MUST
497 * always be larger than the previous input resume handle, in
498 * particular when hitting the last query it is vital to set the
499 * resume handle correctly to avoid infinite client loops, as
500 * seen e.g. with Windows XP SP3 when resume handle is 0 and
501 * status is NT_STATUS_OK - gd */
503 *r->out.resume_handle = (uint32_t)-1;
508 #define LSA_AUDIT_NUM_CATEGORIES_NT4 7
509 #define LSA_AUDIT_NUM_CATEGORIES_WIN2K 9
510 #define LSA_AUDIT_NUM_CATEGORIES LSA_AUDIT_NUM_CATEGORIES_NT4
512 /***************************************************************************
514 ***************************************************************************/
516 NTSTATUS _lsa_QueryInfoPolicy(struct pipes_struct *p,
517 struct lsa_QueryInfoPolicy *r)
519 NTSTATUS status = NT_STATUS_OK;
520 struct lsa_info *handle;
521 struct dom_sid domain_sid;
523 struct dom_sid *sid = NULL;
524 union lsa_PolicyInformation *info = NULL;
525 uint32_t acc_required = 0;
527 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
528 return NT_STATUS_INVALID_HANDLE;
530 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
531 return NT_STATUS_INVALID_HANDLE;
534 switch (r->in.level) {
535 case LSA_POLICY_INFO_AUDIT_LOG:
536 case LSA_POLICY_INFO_AUDIT_EVENTS:
537 acc_required = LSA_POLICY_VIEW_AUDIT_INFORMATION;
539 case LSA_POLICY_INFO_DOMAIN:
540 acc_required = LSA_POLICY_VIEW_LOCAL_INFORMATION;
542 case LSA_POLICY_INFO_PD:
543 acc_required = LSA_POLICY_GET_PRIVATE_INFORMATION;
545 case LSA_POLICY_INFO_ACCOUNT_DOMAIN:
546 acc_required = LSA_POLICY_VIEW_LOCAL_INFORMATION;
548 case LSA_POLICY_INFO_ROLE:
549 case LSA_POLICY_INFO_REPLICA:
550 acc_required = LSA_POLICY_VIEW_LOCAL_INFORMATION;
552 case LSA_POLICY_INFO_QUOTA:
553 acc_required = LSA_POLICY_VIEW_LOCAL_INFORMATION;
555 case LSA_POLICY_INFO_MOD:
556 case LSA_POLICY_INFO_AUDIT_FULL_SET:
557 /* according to MS-LSAD 3.1.4.4.3 */
558 return NT_STATUS_INVALID_PARAMETER;
559 case LSA_POLICY_INFO_AUDIT_FULL_QUERY:
560 acc_required = LSA_POLICY_VIEW_AUDIT_INFORMATION;
562 case LSA_POLICY_INFO_DNS:
563 case LSA_POLICY_INFO_DNS_INT:
564 case LSA_POLICY_INFO_L_ACCOUNT_DOMAIN:
565 acc_required = LSA_POLICY_VIEW_LOCAL_INFORMATION;
571 if (!(handle->access & acc_required)) {
572 /* return NT_STATUS_ACCESS_DENIED; */
575 info = TALLOC_ZERO_P(p->mem_ctx, union lsa_PolicyInformation);
577 return NT_STATUS_NO_MEMORY;
580 switch (r->in.level) {
581 /* according to MS-LSAD 3.1.4.4.3 */
582 case LSA_POLICY_INFO_MOD:
583 case LSA_POLICY_INFO_AUDIT_FULL_SET:
584 case LSA_POLICY_INFO_AUDIT_FULL_QUERY:
585 return NT_STATUS_INVALID_PARAMETER;
586 case LSA_POLICY_INFO_AUDIT_LOG:
587 info->audit_log.percent_full = 0;
588 info->audit_log.maximum_log_size = 0;
589 info->audit_log.retention_time = 0;
590 info->audit_log.shutdown_in_progress = 0;
591 info->audit_log.time_to_shutdown = 0;
592 info->audit_log.next_audit_record = 0;
593 status = NT_STATUS_OK;
595 case LSA_POLICY_INFO_PD:
596 info->pd.name.string = NULL;
597 status = NT_STATUS_OK;
599 case LSA_POLICY_INFO_REPLICA:
600 info->replica.source.string = NULL;
601 info->replica.account.string = NULL;
602 status = NT_STATUS_OK;
604 case LSA_POLICY_INFO_QUOTA:
605 info->quota.paged_pool = 0;
606 info->quota.non_paged_pool = 0;
607 info->quota.min_wss = 0;
608 info->quota.max_wss = 0;
609 info->quota.pagefile = 0;
610 info->quota.unknown = 0;
611 status = NT_STATUS_OK;
613 case LSA_POLICY_INFO_AUDIT_EVENTS:
616 uint32 policy_def = LSA_AUDIT_POLICY_ALL;
618 /* check if the user has enough rights */
619 if (!(handle->access & LSA_POLICY_VIEW_AUDIT_INFORMATION)) {
620 DEBUG(10,("_lsa_QueryInfoPolicy: insufficient access rights\n"));
621 return NT_STATUS_ACCESS_DENIED;
624 /* fake info: We audit everything. ;) */
626 info->audit_events.auditing_mode = true;
627 info->audit_events.count = LSA_AUDIT_NUM_CATEGORIES;
628 info->audit_events.settings = TALLOC_ZERO_ARRAY(p->mem_ctx,
629 enum lsa_PolicyAuditPolicy,
630 info->audit_events.count);
631 if (!info->audit_events.settings) {
632 return NT_STATUS_NO_MEMORY;
635 info->audit_events.settings[LSA_AUDIT_CATEGORY_ACCOUNT_MANAGEMENT] = policy_def;
636 info->audit_events.settings[LSA_AUDIT_CATEGORY_FILE_AND_OBJECT_ACCESS] = policy_def;
637 info->audit_events.settings[LSA_AUDIT_CATEGORY_LOGON] = policy_def;
638 info->audit_events.settings[LSA_AUDIT_CATEGORY_PROCCESS_TRACKING] = policy_def;
639 info->audit_events.settings[LSA_AUDIT_CATEGORY_SECURITY_POLICY_CHANGES] = policy_def;
640 info->audit_events.settings[LSA_AUDIT_CATEGORY_SYSTEM] = policy_def;
641 info->audit_events.settings[LSA_AUDIT_CATEGORY_USE_OF_USER_RIGHTS] = policy_def;
645 case LSA_POLICY_INFO_DOMAIN:
646 /* check if the user has enough rights */
647 if (!(handle->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
648 return NT_STATUS_ACCESS_DENIED;
650 /* Request PolicyPrimaryDomainInformation. */
651 switch (lp_server_role()) {
652 case ROLE_DOMAIN_PDC:
653 case ROLE_DOMAIN_BDC:
654 name = get_global_sam_name();
655 sid = sid_dup_talloc(p->mem_ctx, get_global_sam_sid());
657 return NT_STATUS_NO_MEMORY;
660 case ROLE_DOMAIN_MEMBER:
661 name = lp_workgroup();
662 /* We need to return the Domain SID here. */
663 if (secrets_fetch_domain_sid(lp_workgroup(), &domain_sid)) {
664 sid = sid_dup_talloc(p->mem_ctx, &domain_sid);
666 return NT_STATUS_NO_MEMORY;
669 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
672 case ROLE_STANDALONE:
673 name = lp_workgroup();
677 return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
679 init_dom_query_3(&info->domain, name, sid);
681 case LSA_POLICY_INFO_ACCOUNT_DOMAIN:
682 /* check if the user has enough rights */
683 if (!(handle->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
684 return NT_STATUS_ACCESS_DENIED;
686 /* Request PolicyAccountDomainInformation. */
687 name = get_global_sam_name();
688 sid = get_global_sam_sid();
690 init_dom_query_5(&info->account_domain, name, sid);
692 case LSA_POLICY_INFO_ROLE:
693 /* check if the user has enough rights */
694 if (!(handle->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
695 return NT_STATUS_ACCESS_DENIED;
697 switch (lp_server_role()) {
698 case ROLE_DOMAIN_BDC:
700 * only a BDC is a backup controller
701 * of the domain, it controls.
703 info->role.role = LSA_ROLE_BACKUP;
707 * any other role is a primary
708 * of the domain, it controls.
710 info->role.role = LSA_ROLE_PRIMARY;
714 case LSA_POLICY_INFO_DNS:
715 case LSA_POLICY_INFO_DNS_INT: {
716 struct pdb_domain_info *dominfo;
718 if ((pdb_capabilities() & PDB_CAP_ADS) == 0) {
719 DEBUG(10, ("Not replying to LSA_POLICY_INFO_DNS "
720 "without ADS passdb backend\n"));
721 status = NT_STATUS_INVALID_INFO_CLASS;
725 dominfo = pdb_get_domain_info(info);
726 if (dominfo == NULL) {
727 status = NT_STATUS_NO_MEMORY;
731 init_lsa_StringLarge(&info->dns.name,
733 init_lsa_StringLarge(&info->dns.dns_domain,
734 dominfo->dns_domain);
735 init_lsa_StringLarge(&info->dns.dns_forest,
736 dominfo->dns_forest);
737 info->dns.domain_guid = dominfo->guid;
738 info->dns.sid = &dominfo->sid;
742 DEBUG(0,("_lsa_QueryInfoPolicy: unknown info level in Lsa Query: %d\n",
744 status = NT_STATUS_INVALID_INFO_CLASS;
753 /***************************************************************************
754 _lsa_QueryInfoPolicy2
755 ***************************************************************************/
757 NTSTATUS _lsa_QueryInfoPolicy2(struct pipes_struct *p,
758 struct lsa_QueryInfoPolicy2 *r2)
760 struct lsa_QueryInfoPolicy r;
762 if ((pdb_capabilities() & PDB_CAP_ADS) == 0) {
763 p->rng_fault_state = True;
764 return NT_STATUS_NOT_IMPLEMENTED;
768 r.in.handle = r2->in.handle;
769 r.in.level = r2->in.level;
770 r.out.info = r2->out.info;
772 return _lsa_QueryInfoPolicy(p, &r);
775 /***************************************************************************
776 _lsa_lookup_sids_internal
777 ***************************************************************************/
779 static NTSTATUS _lsa_lookup_sids_internal(struct pipes_struct *p,
781 uint16_t level, /* input */
782 int num_sids, /* input */
783 struct lsa_SidPtr *sid, /* input */
784 struct lsa_RefDomainList **pp_ref, /* input/output */
785 struct lsa_TranslatedName2 **pp_names,/* input/output */
786 uint32_t *pp_mapped_count) /* input/output */
790 const struct dom_sid **sids = NULL;
791 struct lsa_RefDomainList *ref = NULL;
792 uint32 mapped_count = 0;
793 struct lsa_dom_info *dom_infos = NULL;
794 struct lsa_name_info *name_infos = NULL;
795 struct lsa_TranslatedName2 *names = NULL;
797 *pp_mapped_count = 0;
805 sids = TALLOC_ARRAY(p->mem_ctx, const struct dom_sid *, num_sids);
806 ref = TALLOC_ZERO_P(p->mem_ctx, struct lsa_RefDomainList);
808 if (sids == NULL || ref == NULL) {
809 return NT_STATUS_NO_MEMORY;
812 for (i=0; i<num_sids; i++) {
813 sids[i] = sid[i].sid;
816 status = lookup_sids(p->mem_ctx, num_sids, sids, level,
817 &dom_infos, &name_infos);
819 if (!NT_STATUS_IS_OK(status)) {
823 names = TALLOC_ARRAY(p->mem_ctx, struct lsa_TranslatedName2, num_sids);
825 return NT_STATUS_NO_MEMORY;
828 for (i=0; i<LSA_REF_DOMAIN_LIST_MULTIPLIER; i++) {
830 if (!dom_infos[i].valid) {
834 if (init_lsa_ref_domain_list(mem_ctx, ref,
836 &dom_infos[i].sid) != i) {
837 DEBUG(0, ("Domain %s mentioned twice??\n",
839 return NT_STATUS_INTERNAL_ERROR;
843 for (i=0; i<num_sids; i++) {
844 struct lsa_name_info *name = &name_infos[i];
846 if (name->type == SID_NAME_UNKNOWN) {
849 /* Unknown sids should return the string
850 * representation of the SID. Windows 2003 behaves
851 * rather erratic here, in many cases it returns the
852 * RID as 8 bytes hex, in others it returns the full
853 * SID. We (Jerry/VL) could not figure out which the
854 * hard cases are, so leave it with the SID. */
855 name->name = talloc_asprintf(p->mem_ctx, "%s",
858 if (name->name == NULL) {
859 return NT_STATUS_NO_MEMORY;
865 names[i].sid_type = name->type;
866 names[i].name.string = name->name;
867 names[i].sid_index = name->dom_idx;
868 names[i].unknown = 0;
871 status = NT_STATUS_NONE_MAPPED;
872 if (mapped_count > 0) {
873 status = (mapped_count < num_sids) ?
874 STATUS_SOME_UNMAPPED : NT_STATUS_OK;
877 DEBUG(10, ("num_sids %d, mapped_count %d, status %s\n",
878 num_sids, mapped_count, nt_errstr(status)));
880 *pp_mapped_count = mapped_count;
887 /***************************************************************************
889 ***************************************************************************/
891 NTSTATUS _lsa_LookupSids(struct pipes_struct *p,
892 struct lsa_LookupSids *r)
895 struct lsa_info *handle;
896 int num_sids = r->in.sids->num_sids;
897 uint32 mapped_count = 0;
898 struct lsa_RefDomainList *domains = NULL;
899 struct lsa_TranslatedName *names_out = NULL;
900 struct lsa_TranslatedName2 *names = NULL;
903 if ((r->in.level < 1) || (r->in.level > 6)) {
904 return NT_STATUS_INVALID_PARAMETER;
907 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle)) {
908 return NT_STATUS_INVALID_HANDLE;
911 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
912 return NT_STATUS_INVALID_HANDLE;
915 /* check if the user has enough rights */
916 if (!(handle->access & LSA_POLICY_LOOKUP_NAMES)) {
917 return NT_STATUS_ACCESS_DENIED;
920 if (num_sids > MAX_LOOKUP_SIDS) {
921 DEBUG(5,("_lsa_LookupSids: limit of %d exceeded, requested %d\n",
922 MAX_LOOKUP_SIDS, num_sids));
923 return NT_STATUS_NONE_MAPPED;
926 status = _lsa_lookup_sids_internal(p,
935 /* Only return here when there is a real error.
936 NT_STATUS_NONE_MAPPED is a special case as it indicates that none of
937 the requested sids could be resolved. Older versions of XP (pre SP3)
938 rely that we return with the string representations of those SIDs in
939 that case. If we don't, XP crashes - Guenther
942 if (NT_STATUS_IS_ERR(status) &&
943 !NT_STATUS_EQUAL(status, NT_STATUS_NONE_MAPPED)) {
947 /* Convert from lsa_TranslatedName2 to lsa_TranslatedName */
948 names_out = TALLOC_ARRAY(p->mem_ctx, struct lsa_TranslatedName,
951 return NT_STATUS_NO_MEMORY;
954 for (i=0; i<num_sids; i++) {
955 names_out[i].sid_type = names[i].sid_type;
956 names_out[i].name = names[i].name;
957 names_out[i].sid_index = names[i].sid_index;
960 *r->out.domains = domains;
961 r->out.names->count = num_sids;
962 r->out.names->names = names_out;
963 *r->out.count = mapped_count;
968 /***************************************************************************
970 ***************************************************************************/
972 NTSTATUS _lsa_LookupSids2(struct pipes_struct *p,
973 struct lsa_LookupSids2 *r)
976 struct lsa_info *handle;
977 int num_sids = r->in.sids->num_sids;
978 uint32 mapped_count = 0;
979 struct lsa_RefDomainList *domains = NULL;
980 struct lsa_TranslatedName2 *names = NULL;
981 bool check_policy = true;
984 case NDR_LSA_LOOKUPSIDS3:
985 check_policy = false;
987 case NDR_LSA_LOOKUPSIDS2:
992 if ((r->in.level < 1) || (r->in.level > 6)) {
993 return NT_STATUS_INVALID_PARAMETER;
997 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle)) {
998 return NT_STATUS_INVALID_HANDLE;
1001 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1002 return NT_STATUS_INVALID_HANDLE;
1005 /* check if the user has enough rights */
1006 if (!(handle->access & LSA_POLICY_LOOKUP_NAMES)) {
1007 return NT_STATUS_ACCESS_DENIED;
1011 if (num_sids > MAX_LOOKUP_SIDS) {
1012 DEBUG(5,("_lsa_LookupSids2: limit of %d exceeded, requested %d\n",
1013 MAX_LOOKUP_SIDS, num_sids));
1014 return NT_STATUS_NONE_MAPPED;
1017 status = _lsa_lookup_sids_internal(p,
1026 *r->out.domains = domains;
1027 r->out.names->count = num_sids;
1028 r->out.names->names = names;
1029 *r->out.count = mapped_count;
1034 /***************************************************************************
1036 ***************************************************************************/
1038 NTSTATUS _lsa_LookupSids3(struct pipes_struct *p,
1039 struct lsa_LookupSids3 *r)
1041 struct lsa_LookupSids2 q;
1043 /* No policy handle on this call. Restrict to crypto connections. */
1044 if (p->auth.auth_type != DCERPC_AUTH_TYPE_SCHANNEL) {
1045 DEBUG(0,("_lsa_LookupSids3: client %s not using schannel for netlogon\n",
1046 get_remote_machine_name() ));
1047 return NT_STATUS_INVALID_PARAMETER;
1051 q.in.sids = r->in.sids;
1052 q.in.level = r->in.level;
1053 q.in.lookup_options = r->in.lookup_options;
1054 q.in.client_revision = r->in.client_revision;
1055 q.in.names = r->in.names;
1056 q.in.count = r->in.count;
1058 q.out.domains = r->out.domains;
1059 q.out.names = r->out.names;
1060 q.out.count = r->out.count;
1062 return _lsa_LookupSids2(p, &q);
1065 /***************************************************************************
1066 ***************************************************************************/
1068 static int lsa_lookup_level_to_flags(enum lsa_LookupNamesLevel level)
1073 case LSA_LOOKUP_NAMES_ALL: /* 1 */
1074 flags = LOOKUP_NAME_ALL;
1076 case LSA_LOOKUP_NAMES_DOMAINS_ONLY: /* 2 */
1077 flags = LOOKUP_NAME_DOMAIN|LOOKUP_NAME_REMOTE|LOOKUP_NAME_ISOLATED;
1079 case LSA_LOOKUP_NAMES_PRIMARY_DOMAIN_ONLY: /* 3 */
1080 flags = LOOKUP_NAME_DOMAIN|LOOKUP_NAME_ISOLATED;
1082 case LSA_LOOKUP_NAMES_UPLEVEL_TRUSTS_ONLY: /* 4 */
1083 case LSA_LOOKUP_NAMES_FOREST_TRUSTS_ONLY: /* 5 */
1084 case LSA_LOOKUP_NAMES_UPLEVEL_TRUSTS_ONLY2: /* 6 */
1085 case LSA_LOOKUP_NAMES_RODC_REFERRAL_TO_FULL_DC: /* 7 */
1087 flags = LOOKUP_NAME_NONE;
1094 /***************************************************************************
1096 ***************************************************************************/
1098 NTSTATUS _lsa_LookupNames(struct pipes_struct *p,
1099 struct lsa_LookupNames *r)
1101 NTSTATUS status = NT_STATUS_NONE_MAPPED;
1102 struct lsa_info *handle;
1103 struct lsa_String *names = r->in.names;
1104 uint32 num_entries = r->in.num_names;
1105 struct lsa_RefDomainList *domains = NULL;
1106 struct lsa_TranslatedSid *rids = NULL;
1107 uint32 mapped_count = 0;
1110 if (num_entries > MAX_LOOKUP_SIDS) {
1111 num_entries = MAX_LOOKUP_SIDS;
1112 DEBUG(5,("_lsa_LookupNames: truncating name lookup list to %d\n",
1116 flags = lsa_lookup_level_to_flags(r->in.level);
1118 domains = TALLOC_ZERO_P(p->mem_ctx, struct lsa_RefDomainList);
1120 return NT_STATUS_NO_MEMORY;
1124 rids = TALLOC_ZERO_ARRAY(p->mem_ctx, struct lsa_TranslatedSid,
1127 return NT_STATUS_NO_MEMORY;
1133 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle)) {
1134 status = NT_STATUS_INVALID_HANDLE;
1138 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1139 return NT_STATUS_INVALID_HANDLE;
1142 /* check if the user has enough rights */
1143 if (!(handle->access & LSA_POLICY_LOOKUP_NAMES)) {
1144 status = NT_STATUS_ACCESS_DENIED;
1148 /* set up the LSA Lookup RIDs response */
1149 become_root(); /* lookup_name can require root privs */
1150 status = lookup_lsa_rids(p->mem_ctx, domains, rids, num_entries,
1151 names, flags, &mapped_count);
1156 if (NT_STATUS_IS_OK(status) && (num_entries != 0) ) {
1157 if (mapped_count == 0) {
1158 status = NT_STATUS_NONE_MAPPED;
1159 } else if (mapped_count != num_entries) {
1160 status = STATUS_SOME_UNMAPPED;
1164 *r->out.count = mapped_count;
1165 *r->out.domains = domains;
1166 r->out.sids->sids = rids;
1167 r->out.sids->count = num_entries;
1172 /***************************************************************************
1174 ***************************************************************************/
1176 NTSTATUS _lsa_LookupNames2(struct pipes_struct *p,
1177 struct lsa_LookupNames2 *r)
1180 struct lsa_LookupNames q;
1181 struct lsa_TransSidArray2 *sid_array2 = r->in.sids;
1182 struct lsa_TransSidArray *sid_array = NULL;
1185 sid_array = TALLOC_ZERO_P(p->mem_ctx, struct lsa_TransSidArray);
1187 return NT_STATUS_NO_MEMORY;
1190 q.in.handle = r->in.handle;
1191 q.in.num_names = r->in.num_names;
1192 q.in.names = r->in.names;
1193 q.in.level = r->in.level;
1194 q.in.sids = sid_array;
1195 q.in.count = r->in.count;
1196 /* we do not know what this is for */
1197 /* = r->in.unknown1; */
1198 /* = r->in.unknown2; */
1200 q.out.domains = r->out.domains;
1201 q.out.sids = sid_array;
1202 q.out.count = r->out.count;
1204 status = _lsa_LookupNames(p, &q);
1206 sid_array2->count = sid_array->count;
1207 sid_array2->sids = TALLOC_ARRAY(p->mem_ctx, struct lsa_TranslatedSid2, sid_array->count);
1208 if (!sid_array2->sids) {
1209 return NT_STATUS_NO_MEMORY;
1212 for (i=0; i<sid_array->count; i++) {
1213 sid_array2->sids[i].sid_type = sid_array->sids[i].sid_type;
1214 sid_array2->sids[i].rid = sid_array->sids[i].rid;
1215 sid_array2->sids[i].sid_index = sid_array->sids[i].sid_index;
1216 sid_array2->sids[i].unknown = 0;
1219 r->out.sids = sid_array2;
1224 /***************************************************************************
1226 ***************************************************************************/
1228 NTSTATUS _lsa_LookupNames3(struct pipes_struct *p,
1229 struct lsa_LookupNames3 *r)
1232 struct lsa_info *handle;
1233 struct lsa_String *names = r->in.names;
1234 uint32 num_entries = r->in.num_names;
1235 struct lsa_RefDomainList *domains = NULL;
1236 struct lsa_TranslatedSid3 *trans_sids = NULL;
1237 uint32 mapped_count = 0;
1239 bool check_policy = true;
1242 case NDR_LSA_LOOKUPNAMES4:
1243 check_policy = false;
1245 case NDR_LSA_LOOKUPNAMES3:
1247 check_policy = true;
1250 if (num_entries > MAX_LOOKUP_SIDS) {
1251 num_entries = MAX_LOOKUP_SIDS;
1252 DEBUG(5,("_lsa_LookupNames3: truncating name lookup list to %d\n", num_entries));
1255 /* Probably the lookup_level is some sort of bitmask. */
1256 if (r->in.level == 1) {
1257 flags = LOOKUP_NAME_ALL;
1260 domains = TALLOC_ZERO_P(p->mem_ctx, struct lsa_RefDomainList);
1262 return NT_STATUS_NO_MEMORY;
1266 trans_sids = TALLOC_ZERO_ARRAY(p->mem_ctx, struct lsa_TranslatedSid3,
1269 return NT_STATUS_NO_MEMORY;
1277 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle)) {
1278 status = NT_STATUS_INVALID_HANDLE;
1282 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1283 return NT_STATUS_INVALID_HANDLE;
1286 /* check if the user has enough rights */
1287 if (!(handle->access & LSA_POLICY_LOOKUP_NAMES)) {
1288 status = NT_STATUS_ACCESS_DENIED;
1293 /* set up the LSA Lookup SIDs response */
1294 become_root(); /* lookup_name can require root privs */
1295 status = lookup_lsa_sids(p->mem_ctx, domains, trans_sids, num_entries,
1296 names, flags, &mapped_count);
1301 if (NT_STATUS_IS_OK(status)) {
1302 if (mapped_count == 0) {
1303 status = NT_STATUS_NONE_MAPPED;
1304 } else if (mapped_count != num_entries) {
1305 status = STATUS_SOME_UNMAPPED;
1309 *r->out.count = mapped_count;
1310 *r->out.domains = domains;
1311 r->out.sids->sids = trans_sids;
1312 r->out.sids->count = num_entries;
1317 /***************************************************************************
1319 ***************************************************************************/
1321 NTSTATUS _lsa_LookupNames4(struct pipes_struct *p,
1322 struct lsa_LookupNames4 *r)
1324 struct lsa_LookupNames3 q;
1326 /* No policy handle on this call. Restrict to crypto connections. */
1327 if (p->auth.auth_type != DCERPC_AUTH_TYPE_SCHANNEL) {
1328 DEBUG(0,("_lsa_lookup_names4: client %s not using schannel for netlogon\n",
1329 get_remote_machine_name() ));
1330 return NT_STATUS_INVALID_PARAMETER;
1334 q.in.num_names = r->in.num_names;
1335 q.in.names = r->in.names;
1336 q.in.level = r->in.level;
1337 q.in.lookup_options = r->in.lookup_options;
1338 q.in.client_revision = r->in.client_revision;
1339 q.in.sids = r->in.sids;
1340 q.in.count = r->in.count;
1342 q.out.domains = r->out.domains;
1343 q.out.sids = r->out.sids;
1344 q.out.count = r->out.count;
1346 return _lsa_LookupNames3(p, &q);
1349 /***************************************************************************
1350 _lsa_close. Also weird - needs to check if lsa handle is correct. JRA.
1351 ***************************************************************************/
1353 NTSTATUS _lsa_Close(struct pipes_struct *p, struct lsa_Close *r)
1355 if (!find_policy_by_hnd(p, r->in.handle, NULL)) {
1356 return NT_STATUS_INVALID_HANDLE;
1359 close_policy_hnd(p, r->in.handle);
1360 ZERO_STRUCTP(r->out.handle);
1361 return NT_STATUS_OK;
1364 /***************************************************************************
1365 ***************************************************************************/
1367 NTSTATUS _lsa_OpenSecret(struct pipes_struct *p, struct lsa_OpenSecret *r)
1369 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1372 /***************************************************************************
1373 ***************************************************************************/
1375 NTSTATUS _lsa_OpenTrustedDomain(struct pipes_struct *p,
1376 struct lsa_OpenTrustedDomain *r)
1378 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1381 /***************************************************************************
1382 ***************************************************************************/
1384 NTSTATUS _lsa_CreateTrustedDomain(struct pipes_struct *p,
1385 struct lsa_CreateTrustedDomain *r)
1387 return NT_STATUS_ACCESS_DENIED;
1390 /***************************************************************************
1391 ***************************************************************************/
1393 NTSTATUS _lsa_CreateSecret(struct pipes_struct *p, struct lsa_CreateSecret *r)
1395 return NT_STATUS_ACCESS_DENIED;
1398 /***************************************************************************
1399 ***************************************************************************/
1401 NTSTATUS _lsa_SetSecret(struct pipes_struct *p, struct lsa_SetSecret *r)
1403 return NT_STATUS_ACCESS_DENIED;
1406 /***************************************************************************
1408 ***************************************************************************/
1410 NTSTATUS _lsa_DeleteObject(struct pipes_struct *p,
1411 struct lsa_DeleteObject *r)
1414 struct lsa_info *info = NULL;
1416 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info)) {
1417 return NT_STATUS_INVALID_HANDLE;
1420 if (!(info->access & SEC_STD_DELETE)) {
1421 return NT_STATUS_ACCESS_DENIED;
1424 switch (info->type) {
1425 case LSA_HANDLE_ACCOUNT_TYPE:
1426 status = privilege_delete_account(&info->sid);
1427 if (!NT_STATUS_IS_OK(status)) {
1428 DEBUG(10,("_lsa_DeleteObject: privilege_delete_account gave: %s\n",
1429 nt_errstr(status)));
1434 return NT_STATUS_INVALID_HANDLE;
1437 close_policy_hnd(p, r->in.handle);
1438 ZERO_STRUCTP(r->out.handle);
1443 /***************************************************************************
1445 ***************************************************************************/
1447 NTSTATUS _lsa_EnumPrivs(struct pipes_struct *p,
1448 struct lsa_EnumPrivs *r)
1450 struct lsa_info *handle;
1452 uint32 enum_context = *r->in.resume_handle;
1453 int num_privs = count_all_privileges();
1454 struct lsa_PrivEntry *entries = NULL;
1455 struct lsa_LUIDAttribute luid;
1457 /* remember that the enum_context starts at 0 and not 1 */
1459 if ( enum_context >= num_privs )
1460 return NT_STATUS_NO_MORE_ENTRIES;
1462 DEBUG(10,("_lsa_EnumPrivs: enum_context:%d total entries:%d\n",
1463 enum_context, num_privs));
1465 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
1466 return NT_STATUS_INVALID_HANDLE;
1468 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1469 return NT_STATUS_INVALID_HANDLE;
1472 /* check if the user has enough rights
1473 I don't know if it's the right one. not documented. */
1475 if (!(handle->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
1476 return NT_STATUS_ACCESS_DENIED;
1479 entries = TALLOC_ZERO_ARRAY(p->mem_ctx, struct lsa_PrivEntry, num_privs);
1481 return NT_STATUS_NO_MEMORY;
1487 for (i = 0; i < num_privs; i++) {
1488 if( i < enum_context) {
1490 init_lsa_StringLarge(&entries[i].name, NULL);
1492 entries[i].luid.low = 0;
1493 entries[i].luid.high = 0;
1496 init_lsa_StringLarge(&entries[i].name, privs[i].name);
1498 luid = get_privilege_luid( &privs[i].se_priv );
1500 entries[i].luid.low = luid.luid.low;
1501 entries[i].luid.high = luid.luid.high;
1505 enum_context = num_privs;
1507 *r->out.resume_handle = enum_context;
1508 r->out.privs->count = num_privs;
1509 r->out.privs->privs = entries;
1511 return NT_STATUS_OK;
1514 /***************************************************************************
1515 _lsa_LookupPrivDisplayName
1516 ***************************************************************************/
1518 NTSTATUS _lsa_LookupPrivDisplayName(struct pipes_struct *p,
1519 struct lsa_LookupPrivDisplayName *r)
1521 struct lsa_info *handle;
1522 const char *description;
1523 struct lsa_StringLarge *lsa_name;
1525 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
1526 return NT_STATUS_INVALID_HANDLE;
1528 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1529 return NT_STATUS_INVALID_HANDLE;
1532 /* check if the user has enough rights */
1535 * I don't know if it's the right one. not documented.
1537 if (!(handle->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
1538 return NT_STATUS_ACCESS_DENIED;
1540 DEBUG(10,("_lsa_LookupPrivDisplayName: name = %s\n", r->in.name->string));
1542 description = get_privilege_dispname(r->in.name->string);
1544 DEBUG(10,("_lsa_LookupPrivDisplayName: doesn't exist\n"));
1545 return NT_STATUS_NO_SUCH_PRIVILEGE;
1548 DEBUG(10,("_lsa_LookupPrivDisplayName: display name = %s\n", description));
1550 lsa_name = TALLOC_ZERO_P(p->mem_ctx, struct lsa_StringLarge);
1552 return NT_STATUS_NO_MEMORY;
1555 init_lsa_StringLarge(lsa_name, description);
1557 *r->out.returned_language_id = r->in.language_id;
1558 *r->out.disp_name = lsa_name;
1560 return NT_STATUS_OK;
1563 /***************************************************************************
1565 ***************************************************************************/
1567 NTSTATUS _lsa_EnumAccounts(struct pipes_struct *p,
1568 struct lsa_EnumAccounts *r)
1570 struct lsa_info *handle;
1571 struct dom_sid *sid_list;
1572 int i, j, num_entries;
1574 struct lsa_SidPtr *sids = NULL;
1576 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
1577 return NT_STATUS_INVALID_HANDLE;
1579 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1580 return NT_STATUS_INVALID_HANDLE;
1583 if (!(handle->access & LSA_POLICY_VIEW_LOCAL_INFORMATION))
1584 return NT_STATUS_ACCESS_DENIED;
1589 /* The only way we can currently find out all the SIDs that have been
1590 privileged is to scan all privileges */
1592 status = privilege_enumerate_accounts(&sid_list, &num_entries);
1593 if (!NT_STATUS_IS_OK(status)) {
1597 if (*r->in.resume_handle >= num_entries) {
1598 return NT_STATUS_NO_MORE_ENTRIES;
1601 if (num_entries - *r->in.resume_handle) {
1602 sids = TALLOC_ZERO_ARRAY(p->mem_ctx, struct lsa_SidPtr,
1603 num_entries - *r->in.resume_handle);
1605 talloc_free(sid_list);
1606 return NT_STATUS_NO_MEMORY;
1609 for (i = *r->in.resume_handle, j = 0; i < num_entries; i++, j++) {
1610 sids[j].sid = sid_dup_talloc(p->mem_ctx, &sid_list[i]);
1612 talloc_free(sid_list);
1613 return NT_STATUS_NO_MEMORY;
1618 talloc_free(sid_list);
1620 *r->out.resume_handle = num_entries;
1621 r->out.sids->num_sids = num_entries;
1622 r->out.sids->sids = sids;
1624 return NT_STATUS_OK;
1627 /***************************************************************************
1629 ***************************************************************************/
1631 NTSTATUS _lsa_GetUserName(struct pipes_struct *p,
1632 struct lsa_GetUserName *r)
1634 const char *username, *domname;
1635 struct lsa_String *account_name = NULL;
1636 struct lsa_String *authority_name = NULL;
1638 if (r->in.account_name &&
1639 *r->in.account_name) {
1640 return NT_STATUS_INVALID_PARAMETER;
1643 if (r->in.authority_name &&
1644 *r->in.authority_name) {
1645 return NT_STATUS_INVALID_PARAMETER;
1648 if (p->server_info->guest) {
1650 * I'm 99% sure this is not the right place to do this,
1651 * global_sid_Anonymous should probably be put into the token
1652 * instead of the guest id -- vl
1654 if (!lookup_sid(p->mem_ctx, &global_sid_Anonymous,
1655 &domname, &username, NULL)) {
1656 return NT_STATUS_NO_MEMORY;
1659 username = p->server_info->sanitized_username;
1660 domname = p->server_info->info3->base.domain.string;
1663 account_name = TALLOC_P(p->mem_ctx, struct lsa_String);
1664 if (!account_name) {
1665 return NT_STATUS_NO_MEMORY;
1667 init_lsa_String(account_name, username);
1669 if (r->out.authority_name) {
1670 authority_name = TALLOC_P(p->mem_ctx, struct lsa_String);
1671 if (!authority_name) {
1672 return NT_STATUS_NO_MEMORY;
1674 init_lsa_String(authority_name, domname);
1677 *r->out.account_name = account_name;
1678 if (r->out.authority_name) {
1679 *r->out.authority_name = authority_name;
1682 return NT_STATUS_OK;
1685 /***************************************************************************
1687 ***************************************************************************/
1689 NTSTATUS _lsa_CreateAccount(struct pipes_struct *p,
1690 struct lsa_CreateAccount *r)
1693 struct lsa_info *handle;
1694 struct lsa_info *info;
1695 uint32_t acc_granted;
1696 struct security_descriptor *psd;
1699 /* find the connection policy handle. */
1700 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
1701 return NT_STATUS_INVALID_HANDLE;
1703 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1704 return NT_STATUS_INVALID_HANDLE;
1707 /* check if the user has enough rights */
1709 if (!(handle->access & LSA_POLICY_CREATE_ACCOUNT)) {
1710 return NT_STATUS_ACCESS_DENIED;
1713 /* Work out max allowed. */
1714 map_max_allowed_access(p->server_info->ptok,
1715 &p->server_info->utok,
1716 &r->in.access_mask);
1718 /* map the generic bits to the lsa policy ones */
1719 se_map_generic(&r->in.access_mask, &lsa_account_mapping);
1721 status = make_lsa_object_sd(p->mem_ctx, &psd, &sd_size,
1722 &lsa_account_mapping,
1723 r->in.sid, LSA_POLICY_ALL_ACCESS);
1724 if (!NT_STATUS_IS_OK(status)) {
1728 status = access_check_object(psd, p->server_info->ptok,
1729 NULL, 0, r->in.access_mask,
1730 &acc_granted, "_lsa_CreateAccount");
1731 if (!NT_STATUS_IS_OK(status)) {
1735 if ( is_privileged_sid( r->in.sid ) )
1736 return NT_STATUS_OBJECT_NAME_COLLISION;
1738 /* associate the user/group SID with the (unique) handle. */
1740 info = TALLOC_ZERO_P(p->mem_ctx, struct lsa_info);
1742 return NT_STATUS_NO_MEMORY;
1745 info->sid = *r->in.sid;
1746 info->access = acc_granted;
1747 info->type = LSA_HANDLE_ACCOUNT_TYPE;
1749 /* get a (unique) handle. open a policy on it. */
1750 if (!create_policy_hnd(p, r->out.acct_handle, info))
1751 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1753 return privilege_create_account( &info->sid );
1756 /***************************************************************************
1758 ***************************************************************************/
1760 NTSTATUS _lsa_OpenAccount(struct pipes_struct *p,
1761 struct lsa_OpenAccount *r)
1763 struct lsa_info *handle;
1764 struct lsa_info *info;
1765 struct security_descriptor *psd = NULL;
1767 uint32_t des_access = r->in.access_mask;
1768 uint32_t acc_granted;
1771 /* find the connection policy handle. */
1772 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
1773 return NT_STATUS_INVALID_HANDLE;
1775 if (handle->type != LSA_HANDLE_POLICY_TYPE) {
1776 return NT_STATUS_INVALID_HANDLE;
1779 /* des_access is for the account here, not the policy
1780 * handle - so don't check against policy handle. */
1782 /* Work out max allowed. */
1783 map_max_allowed_access(p->server_info->ptok,
1784 &p->server_info->utok,
1787 /* map the generic bits to the lsa account ones */
1788 se_map_generic(&des_access, &lsa_account_mapping);
1790 /* get the generic lsa account SD until we store it */
1791 status = make_lsa_object_sd(p->mem_ctx, &psd, &sd_size,
1792 &lsa_account_mapping,
1793 r->in.sid, LSA_ACCOUNT_ALL_ACCESS);
1794 if (!NT_STATUS_IS_OK(status)) {
1798 status = access_check_object(psd, p->server_info->ptok,
1799 NULL, 0, des_access,
1800 &acc_granted, "_lsa_OpenAccount" );
1801 if (!NT_STATUS_IS_OK(status)) {
1805 /* TODO: Fis the parsing routine before reenabling this check! */
1807 if (!lookup_sid(&handle->sid, dom_name, name, &type))
1808 return NT_STATUS_ACCESS_DENIED;
1810 /* associate the user/group SID with the (unique) handle. */
1811 info = TALLOC_ZERO_P(p->mem_ctx, struct lsa_info);
1813 return NT_STATUS_NO_MEMORY;
1816 info->sid = *r->in.sid;
1817 info->access = acc_granted;
1818 info->type = LSA_HANDLE_ACCOUNT_TYPE;
1820 /* get a (unique) handle. open a policy on it. */
1821 if (!create_policy_hnd(p, r->out.acct_handle, info))
1822 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
1824 return NT_STATUS_OK;
1827 /***************************************************************************
1828 _lsa_EnumPrivsAccount
1829 For a given SID, enumerate all the privilege this account has.
1830 ***************************************************************************/
1832 NTSTATUS _lsa_EnumPrivsAccount(struct pipes_struct *p,
1833 struct lsa_EnumPrivsAccount *r)
1835 NTSTATUS status = NT_STATUS_OK;
1836 struct lsa_info *info=NULL;
1838 PRIVILEGE_SET privileges;
1839 struct lsa_PrivilegeSet *priv_set = NULL;
1840 struct lsa_LUIDAttribute *luid_attrs = NULL;
1843 /* find the connection policy handle. */
1844 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
1845 return NT_STATUS_INVALID_HANDLE;
1847 if (info->type != LSA_HANDLE_ACCOUNT_TYPE) {
1848 return NT_STATUS_INVALID_HANDLE;
1851 if (!(info->access & LSA_ACCOUNT_VIEW))
1852 return NT_STATUS_ACCESS_DENIED;
1854 get_privileges_for_sids(&mask, &info->sid, 1);
1856 privilege_set_init( &privileges );
1858 priv_set = TALLOC_ZERO_P(p->mem_ctx, struct lsa_PrivilegeSet);
1860 status = NT_STATUS_NO_MEMORY;
1864 if ( se_priv_to_privilege_set( &privileges, &mask ) ) {
1866 DEBUG(10,("_lsa_EnumPrivsAccount: %s has %d privileges\n",
1867 sid_string_dbg(&info->sid),
1870 luid_attrs = TALLOC_ZERO_ARRAY(p->mem_ctx,
1871 struct lsa_LUIDAttribute,
1874 status = NT_STATUS_NO_MEMORY;
1878 for (i=0; i<privileges.count; i++) {
1879 luid_attrs[i] = privileges.set[i];
1882 priv_set->count = privileges.count;
1883 priv_set->unknown = 0;
1884 priv_set->set = luid_attrs;
1887 priv_set->count = 0;
1888 priv_set->unknown = 0;
1889 priv_set->set = NULL;
1892 *r->out.privs = priv_set;
1895 privilege_set_free( &privileges );
1900 /***************************************************************************
1901 _lsa_GetSystemAccessAccount
1902 ***************************************************************************/
1904 NTSTATUS _lsa_GetSystemAccessAccount(struct pipes_struct *p,
1905 struct lsa_GetSystemAccessAccount *r)
1908 struct lsa_info *info = NULL;
1909 struct lsa_EnumPrivsAccount e;
1910 struct lsa_PrivilegeSet *privset;
1912 /* find the connection policy handle. */
1914 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
1915 return NT_STATUS_INVALID_HANDLE;
1917 if (info->type != LSA_HANDLE_ACCOUNT_TYPE) {
1918 return NT_STATUS_INVALID_HANDLE;
1921 if (!(info->access & LSA_ACCOUNT_VIEW))
1922 return NT_STATUS_ACCESS_DENIED;
1924 privset = talloc_zero(p->mem_ctx, struct lsa_PrivilegeSet);
1926 return NT_STATUS_NO_MEMORY;
1929 e.in.handle = r->in.handle;
1930 e.out.privs = &privset;
1932 status = _lsa_EnumPrivsAccount(p, &e);
1933 if (!NT_STATUS_IS_OK(status)) {
1934 DEBUG(10,("_lsa_GetSystemAccessAccount: "
1935 "failed to call _lsa_EnumPrivsAccount(): %s\n",
1936 nt_errstr(status)));
1940 /* Samba4 would iterate over the privset to merge the policy mode bits,
1941 * not sure samba3 can do the same here, so just return what we did in
1945 0x01 -> Log on locally
1946 0x02 -> Access this computer from network
1947 0x04 -> Log on as a batch job
1948 0x10 -> Log on as a service
1950 they can be ORed together
1953 *r->out.access_mask = LSA_POLICY_MODE_INTERACTIVE |
1954 LSA_POLICY_MODE_NETWORK;
1956 return NT_STATUS_OK;
1959 /***************************************************************************
1960 update the systemaccount information
1961 ***************************************************************************/
1963 NTSTATUS _lsa_SetSystemAccessAccount(struct pipes_struct *p,
1964 struct lsa_SetSystemAccessAccount *r)
1966 struct lsa_info *info=NULL;
1969 /* find the connection policy handle. */
1970 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
1971 return NT_STATUS_INVALID_HANDLE;
1973 if (info->type != LSA_HANDLE_ACCOUNT_TYPE) {
1974 return NT_STATUS_INVALID_HANDLE;
1977 if (!(info->access & LSA_ACCOUNT_ADJUST_SYSTEM_ACCESS)) {
1978 return NT_STATUS_ACCESS_DENIED;
1981 if (!pdb_getgrsid(&map, info->sid))
1982 return NT_STATUS_NO_SUCH_GROUP;
1984 return pdb_update_group_mapping_entry(&map);
1987 /***************************************************************************
1988 _lsa_AddPrivilegesToAccount
1989 For a given SID, add some privileges.
1990 ***************************************************************************/
1992 NTSTATUS _lsa_AddPrivilegesToAccount(struct pipes_struct *p,
1993 struct lsa_AddPrivilegesToAccount *r)
1995 struct lsa_info *info = NULL;
1997 struct lsa_PrivilegeSet *set = NULL;
1999 /* find the connection policy handle. */
2000 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
2001 return NT_STATUS_INVALID_HANDLE;
2003 if (info->type != LSA_HANDLE_ACCOUNT_TYPE) {
2004 return NT_STATUS_INVALID_HANDLE;
2007 if (!(info->access & LSA_ACCOUNT_ADJUST_PRIVILEGES)) {
2008 return NT_STATUS_ACCESS_DENIED;
2012 if ( !privilege_set_to_se_priv( &mask, set ) )
2013 return NT_STATUS_NO_SUCH_PRIVILEGE;
2015 if ( !grant_privilege( &info->sid, &mask ) ) {
2016 DEBUG(3,("_lsa_AddPrivilegesToAccount: grant_privilege(%s) failed!\n",
2017 sid_string_dbg(&info->sid) ));
2018 DEBUG(3,("Privilege mask:\n"));
2019 dump_se_priv( DBGC_ALL, 3, &mask );
2020 return NT_STATUS_NO_SUCH_PRIVILEGE;
2023 return NT_STATUS_OK;
2026 /***************************************************************************
2027 _lsa_RemovePrivilegesFromAccount
2028 For a given SID, remove some privileges.
2029 ***************************************************************************/
2031 NTSTATUS _lsa_RemovePrivilegesFromAccount(struct pipes_struct *p,
2032 struct lsa_RemovePrivilegesFromAccount *r)
2034 struct lsa_info *info = NULL;
2036 struct lsa_PrivilegeSet *set = NULL;
2038 /* find the connection policy handle. */
2039 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
2040 return NT_STATUS_INVALID_HANDLE;
2042 if (info->type != LSA_HANDLE_ACCOUNT_TYPE) {
2043 return NT_STATUS_INVALID_HANDLE;
2046 if (!(info->access & LSA_ACCOUNT_ADJUST_PRIVILEGES)) {
2047 return NT_STATUS_ACCESS_DENIED;
2052 if ( !privilege_set_to_se_priv( &mask, set ) )
2053 return NT_STATUS_NO_SUCH_PRIVILEGE;
2055 if ( !revoke_privilege( &info->sid, &mask ) ) {
2056 DEBUG(3,("_lsa_RemovePrivilegesFromAccount: revoke_privilege(%s) failed!\n",
2057 sid_string_dbg(&info->sid) ));
2058 DEBUG(3,("Privilege mask:\n"));
2059 dump_se_priv( DBGC_ALL, 3, &mask );
2060 return NT_STATUS_NO_SUCH_PRIVILEGE;
2063 return NT_STATUS_OK;
2066 /***************************************************************************
2068 ***************************************************************************/
2070 NTSTATUS _lsa_LookupPrivName(struct pipes_struct *p,
2071 struct lsa_LookupPrivName *r)
2073 struct lsa_info *info = NULL;
2075 struct lsa_StringLarge *lsa_name;
2077 /* find the connection policy handle. */
2078 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info)) {
2079 return NT_STATUS_INVALID_HANDLE;
2082 if (info->type != LSA_HANDLE_POLICY_TYPE) {
2083 return NT_STATUS_INVALID_HANDLE;
2086 if (!(info->access & LSA_POLICY_VIEW_LOCAL_INFORMATION)) {
2087 return NT_STATUS_ACCESS_DENIED;
2090 name = luid_to_privilege_name(r->in.luid);
2092 return NT_STATUS_NO_SUCH_PRIVILEGE;
2095 lsa_name = TALLOC_ZERO_P(p->mem_ctx, struct lsa_StringLarge);
2097 return NT_STATUS_NO_MEMORY;
2100 lsa_name->string = talloc_strdup(lsa_name, name);
2101 if (!lsa_name->string) {
2102 TALLOC_FREE(lsa_name);
2103 return NT_STATUS_NO_MEMORY;
2106 *r->out.name = lsa_name;
2108 return NT_STATUS_OK;
2111 /***************************************************************************
2113 ***************************************************************************/
2115 NTSTATUS _lsa_QuerySecurity(struct pipes_struct *p,
2116 struct lsa_QuerySecurity *r)
2118 struct lsa_info *handle=NULL;
2119 struct security_descriptor *psd = NULL;
2123 /* find the connection policy handle. */
2124 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&handle))
2125 return NT_STATUS_INVALID_HANDLE;
2127 switch (handle->type) {
2128 case LSA_HANDLE_POLICY_TYPE:
2129 status = make_lsa_object_sd(p->mem_ctx, &psd, &sd_size,
2130 &lsa_policy_mapping, NULL, 0);
2132 case LSA_HANDLE_ACCOUNT_TYPE:
2133 status = make_lsa_object_sd(p->mem_ctx, &psd, &sd_size,
2134 &lsa_account_mapping,
2135 &handle->sid, LSA_ACCOUNT_ALL_ACCESS);
2138 status = NT_STATUS_INVALID_HANDLE;
2142 if (!NT_STATUS_IS_OK(status)) {
2146 *r->out.sdbuf = make_sec_desc_buf(p->mem_ctx, sd_size, psd);
2147 if (!*r->out.sdbuf) {
2148 return NT_STATUS_NO_MEMORY;
2154 /***************************************************************************
2155 _lsa_AddAccountRights
2156 ***************************************************************************/
2158 NTSTATUS _lsa_AddAccountRights(struct pipes_struct *p,
2159 struct lsa_AddAccountRights *r)
2161 struct lsa_info *info = NULL;
2163 uint32_t acc_granted = 0;
2164 struct security_descriptor *psd = NULL;
2169 /* find the connection policy handle. */
2170 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
2171 return NT_STATUS_INVALID_HANDLE;
2173 if (info->type != LSA_HANDLE_POLICY_TYPE) {
2174 return NT_STATUS_INVALID_HANDLE;
2177 /* get the generic lsa account SD for this SID until we store it */
2178 status = make_lsa_object_sd(p->mem_ctx, &psd, &sd_size,
2179 &lsa_account_mapping,
2180 r->in.sid, LSA_ACCOUNT_ALL_ACCESS);
2181 if (!NT_STATUS_IS_OK(status)) {
2186 * From the MS DOCs. If the sid doesn't exist, ask for LSA_POLICY_CREATE_ACCOUNT
2187 * on the policy handle. If it does, ask for
2188 * LSA_ACCOUNT_ADJUST_PRIVILEGES|LSA_ACCOUNT_ADJUST_SYSTEM_ACCESS|LSA_ACCOUNT_VIEW,
2189 * on the account sid. We don't check here so just use the latter. JRA.
2192 status = access_check_object(psd, p->server_info->ptok,
2194 LSA_ACCOUNT_ADJUST_PRIVILEGES|LSA_ACCOUNT_ADJUST_SYSTEM_ACCESS|LSA_ACCOUNT_VIEW,
2195 &acc_granted, "_lsa_AddAccountRights" );
2196 if (!NT_STATUS_IS_OK(status)) {
2200 /* according to an NT4 PDC, you can add privileges to SIDs even without
2201 call_lsa_create_account() first. And you can use any arbitrary SID. */
2203 sid_copy( &sid, r->in.sid );
2205 for ( i=0; i < r->in.rights->count; i++ ) {
2207 const char *privname = r->in.rights->names[i].string;
2209 /* only try to add non-null strings */
2214 if ( !grant_privilege_by_name( &sid, privname ) ) {
2215 DEBUG(2,("_lsa_AddAccountRights: Failed to add privilege [%s]\n",
2217 return NT_STATUS_NO_SUCH_PRIVILEGE;
2221 return NT_STATUS_OK;
2224 /***************************************************************************
2225 _lsa_RemoveAccountRights
2226 ***************************************************************************/
2228 NTSTATUS _lsa_RemoveAccountRights(struct pipes_struct *p,
2229 struct lsa_RemoveAccountRights *r)
2231 struct lsa_info *info = NULL;
2233 struct security_descriptor *psd = NULL;
2236 const char *privname = NULL;
2237 uint32_t acc_granted = 0;
2240 /* find the connection policy handle. */
2241 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
2242 return NT_STATUS_INVALID_HANDLE;
2244 if (info->type != LSA_HANDLE_POLICY_TYPE) {
2245 return NT_STATUS_INVALID_HANDLE;
2248 /* get the generic lsa account SD for this SID until we store it */
2249 status = make_lsa_object_sd(p->mem_ctx, &psd, &sd_size,
2250 &lsa_account_mapping,
2251 r->in.sid, LSA_ACCOUNT_ALL_ACCESS);
2252 if (!NT_STATUS_IS_OK(status)) {
2257 * From the MS DOCs. We need
2258 * LSA_ACCOUNT_ADJUST_PRIVILEGES|LSA_ACCOUNT_ADJUST_SYSTEM_ACCESS|LSA_ACCOUNT_VIEW
2259 * and DELETE on the account sid.
2262 status = access_check_object(psd, p->server_info->ptok,
2264 LSA_ACCOUNT_ADJUST_PRIVILEGES|LSA_ACCOUNT_ADJUST_SYSTEM_ACCESS|
2265 LSA_ACCOUNT_VIEW|SEC_STD_DELETE,
2266 &acc_granted, "_lsa_RemoveAccountRights");
2267 if (!NT_STATUS_IS_OK(status)) {
2271 sid_copy( &sid, r->in.sid );
2273 if ( r->in.remove_all ) {
2274 if ( !revoke_all_privileges( &sid ) )
2275 return NT_STATUS_ACCESS_DENIED;
2277 return NT_STATUS_OK;
2280 for ( i=0; i < r->in.rights->count; i++ ) {
2282 privname = r->in.rights->names[i].string;
2284 /* only try to add non-null strings */
2289 if ( !revoke_privilege_by_name( &sid, privname ) ) {
2290 DEBUG(2,("_lsa_RemoveAccountRights: Failed to revoke privilege [%s]\n",
2292 return NT_STATUS_NO_SUCH_PRIVILEGE;
2296 return NT_STATUS_OK;
2299 /*******************************************************************
2300 ********************************************************************/
2302 static NTSTATUS init_lsa_right_set(TALLOC_CTX *mem_ctx,
2303 struct lsa_RightSet *r,
2304 PRIVILEGE_SET *privileges)
2307 const char *privname;
2308 const char **privname_array = NULL;
2311 for (i=0; i<privileges->count; i++) {
2313 privname = luid_to_privilege_name(&privileges->set[i].luid);
2315 if (!add_string_to_array(mem_ctx, privname,
2316 &privname_array, &num_priv)) {
2317 return NT_STATUS_NO_MEMORY;
2324 r->names = TALLOC_ZERO_ARRAY(mem_ctx, struct lsa_StringLarge,
2327 return NT_STATUS_NO_MEMORY;
2330 for (i=0; i<num_priv; i++) {
2331 init_lsa_StringLarge(&r->names[i], privname_array[i]);
2334 r->count = num_priv;
2337 return NT_STATUS_OK;
2340 /***************************************************************************
2341 _lsa_EnumAccountRights
2342 ***************************************************************************/
2344 NTSTATUS _lsa_EnumAccountRights(struct pipes_struct *p,
2345 struct lsa_EnumAccountRights *r)
2348 struct lsa_info *info = NULL;
2350 PRIVILEGE_SET privileges;
2353 /* find the connection policy handle. */
2355 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
2356 return NT_STATUS_INVALID_HANDLE;
2358 if (info->type != LSA_HANDLE_POLICY_TYPE) {
2359 return NT_STATUS_INVALID_HANDLE;
2362 if (!(info->access & LSA_ACCOUNT_VIEW)) {
2363 return NT_STATUS_ACCESS_DENIED;
2366 /* according to an NT4 PDC, you can add privileges to SIDs even without
2367 call_lsa_create_account() first. And you can use any arbitrary SID. */
2369 sid_copy( &sid, r->in.sid );
2371 /* according to MS-LSAD 3.1.4.5.10 it is required to return
2372 * NT_STATUS_OBJECT_NAME_NOT_FOUND if the account sid was not found in
2373 * the lsa database */
2375 if (!get_privileges_for_sids(&mask, &sid, 1)) {
2376 return NT_STATUS_OBJECT_NAME_NOT_FOUND;
2379 status = privilege_set_init(&privileges);
2380 if (!NT_STATUS_IS_OK(status)) {
2384 se_priv_to_privilege_set(&privileges, &mask);
2386 DEBUG(10,("_lsa_EnumAccountRights: %s has %d privileges\n",
2387 sid_string_dbg(&sid), privileges.count));
2389 status = init_lsa_right_set(p->mem_ctx, r->out.rights, &privileges);
2391 privilege_set_free( &privileges );
2396 /***************************************************************************
2397 _lsa_LookupPrivValue
2398 ***************************************************************************/
2400 NTSTATUS _lsa_LookupPrivValue(struct pipes_struct *p,
2401 struct lsa_LookupPrivValue *r)
2403 struct lsa_info *info = NULL;
2404 const char *name = NULL;
2405 struct lsa_LUIDAttribute priv_luid;
2408 /* find the connection policy handle. */
2410 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info))
2411 return NT_STATUS_INVALID_HANDLE;
2413 if (info->type != LSA_HANDLE_POLICY_TYPE) {
2414 return NT_STATUS_INVALID_HANDLE;
2417 if (!(info->access & LSA_POLICY_LOOKUP_NAMES))
2418 return NT_STATUS_ACCESS_DENIED;
2420 name = r->in.name->string;
2422 DEBUG(10,("_lsa_lookup_priv_value: name = %s\n", name));
2424 if ( !se_priv_from_name( name, &mask ) )
2425 return NT_STATUS_NO_SUCH_PRIVILEGE;
2427 priv_luid = get_privilege_luid( &mask );
2429 r->out.luid->low = priv_luid.luid.low;
2430 r->out.luid->high = priv_luid.luid.high;
2432 return NT_STATUS_OK;
2435 /***************************************************************************
2436 _lsa_EnumAccountsWithUserRight
2437 ***************************************************************************/
2439 NTSTATUS _lsa_EnumAccountsWithUserRight(struct pipes_struct *p,
2440 struct lsa_EnumAccountsWithUserRight *r)
2443 struct lsa_info *info = NULL;
2444 struct dom_sid *sids = NULL;
2449 if (!find_policy_by_hnd(p, r->in.handle, (void **)(void *)&info)) {
2450 return NT_STATUS_INVALID_HANDLE;
2453 if (info->type != LSA_HANDLE_POLICY_TYPE) {
2454 return NT_STATUS_INVALID_HANDLE;
2457 if (!(info->access & LSA_POLICY_LOOKUP_NAMES)) {
2458 return NT_STATUS_ACCESS_DENIED;
2461 if (!r->in.name || !r->in.name->string) {
2462 return NT_STATUS_NO_SUCH_PRIVILEGE;
2465 if (!se_priv_from_name(r->in.name->string, &mask)) {
2466 return NT_STATUS_NO_SUCH_PRIVILEGE;
2469 status = privilege_enum_sids(&mask, p->mem_ctx,
2471 if (!NT_STATUS_IS_OK(status)) {
2475 r->out.sids->num_sids = num_sids;
2476 r->out.sids->sids = talloc_array(p->mem_ctx, struct lsa_SidPtr,
2477 r->out.sids->num_sids);
2479 for (i=0; i < r->out.sids->num_sids; i++) {
2480 r->out.sids->sids[i].sid = sid_dup_talloc(r->out.sids->sids,
2482 if (!r->out.sids->sids[i].sid) {
2483 TALLOC_FREE(r->out.sids->sids);
2484 r->out.sids->num_sids = 0;
2485 return NT_STATUS_NO_MEMORY;
2489 return NT_STATUS_OK;
2492 /***************************************************************************
2494 ***************************************************************************/
2496 NTSTATUS _lsa_Delete(struct pipes_struct *p,
2497 struct lsa_Delete *r)
2499 return NT_STATUS_NOT_SUPPORTED;
2503 * From here on the server routines are just dummy ones to make smbd link with
2504 * librpc/gen_ndr/srv_lsa.c. These routines are actually never called, we are
2505 * pulling the server stubs across one by one.
2508 NTSTATUS _lsa_SetSecObj(struct pipes_struct *p, struct lsa_SetSecObj *r)
2510 p->rng_fault_state = True;
2511 return NT_STATUS_NOT_IMPLEMENTED;
2514 NTSTATUS _lsa_ChangePassword(struct pipes_struct *p,
2515 struct lsa_ChangePassword *r)
2517 p->rng_fault_state = True;
2518 return NT_STATUS_NOT_IMPLEMENTED;
2521 NTSTATUS _lsa_SetInfoPolicy(struct pipes_struct *p, struct lsa_SetInfoPolicy *r)
2523 p->rng_fault_state = True;
2524 return NT_STATUS_NOT_IMPLEMENTED;
2527 NTSTATUS _lsa_ClearAuditLog(struct pipes_struct *p, struct lsa_ClearAuditLog *r)
2529 p->rng_fault_state = True;
2530 return NT_STATUS_NOT_IMPLEMENTED;
2533 NTSTATUS _lsa_GetQuotasForAccount(struct pipes_struct *p,
2534 struct lsa_GetQuotasForAccount *r)
2536 p->rng_fault_state = True;
2537 return NT_STATUS_NOT_IMPLEMENTED;
2540 NTSTATUS _lsa_SetQuotasForAccount(struct pipes_struct *p,
2541 struct lsa_SetQuotasForAccount *r)
2543 p->rng_fault_state = True;
2544 return NT_STATUS_NOT_IMPLEMENTED;
2547 NTSTATUS _lsa_QueryTrustedDomainInfo(struct pipes_struct *p,
2548 struct lsa_QueryTrustedDomainInfo *r)
2550 p->rng_fault_state = True;
2551 return NT_STATUS_NOT_IMPLEMENTED;
2554 NTSTATUS _lsa_SetInformationTrustedDomain(struct pipes_struct *p,
2555 struct lsa_SetInformationTrustedDomain *r)
2557 p->rng_fault_state = True;
2558 return NT_STATUS_NOT_IMPLEMENTED;
2561 NTSTATUS _lsa_QuerySecret(struct pipes_struct *p, struct lsa_QuerySecret *r)
2563 p->rng_fault_state = True;
2564 return NT_STATUS_NOT_IMPLEMENTED;
2567 NTSTATUS _lsa_QueryTrustedDomainInfoBySid(struct pipes_struct *p,
2568 struct lsa_QueryTrustedDomainInfoBySid *r)
2570 p->rng_fault_state = True;
2571 return NT_STATUS_NOT_IMPLEMENTED;
2574 NTSTATUS _lsa_SetTrustedDomainInfo(struct pipes_struct *p,
2575 struct lsa_SetTrustedDomainInfo *r)
2577 p->rng_fault_state = True;
2578 return NT_STATUS_NOT_IMPLEMENTED;
2581 NTSTATUS _lsa_DeleteTrustedDomain(struct pipes_struct *p,
2582 struct lsa_DeleteTrustedDomain *r)
2584 p->rng_fault_state = True;
2585 return NT_STATUS_NOT_IMPLEMENTED;
2588 NTSTATUS _lsa_StorePrivateData(struct pipes_struct *p,
2589 struct lsa_StorePrivateData *r)
2591 p->rng_fault_state = True;
2592 return NT_STATUS_NOT_IMPLEMENTED;
2595 NTSTATUS _lsa_RetrievePrivateData(struct pipes_struct *p,
2596 struct lsa_RetrievePrivateData *r)
2598 p->rng_fault_state = True;
2599 return NT_STATUS_NOT_IMPLEMENTED;
2602 NTSTATUS _lsa_SetInfoPolicy2(struct pipes_struct *p,
2603 struct lsa_SetInfoPolicy2 *r)
2605 p->rng_fault_state = True;
2606 return NT_STATUS_NOT_IMPLEMENTED;
2609 NTSTATUS _lsa_QueryTrustedDomainInfoByName(struct pipes_struct *p,
2610 struct lsa_QueryTrustedDomainInfoByName *r)
2612 p->rng_fault_state = True;
2613 return NT_STATUS_NOT_IMPLEMENTED;
2616 NTSTATUS _lsa_SetTrustedDomainInfoByName(struct pipes_struct *p,
2617 struct lsa_SetTrustedDomainInfoByName *r)
2619 p->rng_fault_state = True;
2620 return NT_STATUS_NOT_IMPLEMENTED;
2623 NTSTATUS _lsa_EnumTrustedDomainsEx(struct pipes_struct *p,
2624 struct lsa_EnumTrustedDomainsEx *r)
2626 p->rng_fault_state = True;
2627 return NT_STATUS_NOT_IMPLEMENTED;
2630 NTSTATUS _lsa_CreateTrustedDomainEx(struct pipes_struct *p,
2631 struct lsa_CreateTrustedDomainEx *r)
2633 p->rng_fault_state = True;
2634 return NT_STATUS_NOT_IMPLEMENTED;
2637 NTSTATUS _lsa_CloseTrustedDomainEx(struct pipes_struct *p,
2638 struct lsa_CloseTrustedDomainEx *r)
2640 p->rng_fault_state = True;
2641 return NT_STATUS_NOT_IMPLEMENTED;
2644 NTSTATUS _lsa_QueryDomainInformationPolicy(struct pipes_struct *p,
2645 struct lsa_QueryDomainInformationPolicy *r)
2647 p->rng_fault_state = True;
2648 return NT_STATUS_NOT_IMPLEMENTED;
2651 NTSTATUS _lsa_SetDomainInformationPolicy(struct pipes_struct *p,
2652 struct lsa_SetDomainInformationPolicy *r)
2654 p->rng_fault_state = True;
2655 return NT_STATUS_NOT_IMPLEMENTED;
2658 NTSTATUS _lsa_OpenTrustedDomainByName(struct pipes_struct *p,
2659 struct lsa_OpenTrustedDomainByName *r)
2661 p->rng_fault_state = True;
2662 return NT_STATUS_NOT_IMPLEMENTED;
2665 NTSTATUS _lsa_TestCall(struct pipes_struct *p, struct lsa_TestCall *r)
2667 p->rng_fault_state = True;
2668 return NT_STATUS_NOT_IMPLEMENTED;
2671 NTSTATUS _lsa_CreateTrustedDomainEx2(struct pipes_struct *p,
2672 struct lsa_CreateTrustedDomainEx2 *r)
2674 p->rng_fault_state = True;
2675 return NT_STATUS_NOT_IMPLEMENTED;
2678 NTSTATUS _lsa_CREDRWRITE(struct pipes_struct *p, struct lsa_CREDRWRITE *r)
2680 p->rng_fault_state = True;
2681 return NT_STATUS_NOT_IMPLEMENTED;
2684 NTSTATUS _lsa_CREDRREAD(struct pipes_struct *p, struct lsa_CREDRREAD *r)
2686 p->rng_fault_state = True;
2687 return NT_STATUS_NOT_IMPLEMENTED;
2690 NTSTATUS _lsa_CREDRENUMERATE(struct pipes_struct *p, struct lsa_CREDRENUMERATE *r)
2692 p->rng_fault_state = True;
2693 return NT_STATUS_NOT_IMPLEMENTED;
2696 NTSTATUS _lsa_CREDRWRITEDOMAINCREDENTIALS(struct pipes_struct *p,
2697 struct lsa_CREDRWRITEDOMAINCREDENTIALS *r)
2699 p->rng_fault_state = True;
2700 return NT_STATUS_NOT_IMPLEMENTED;
2703 NTSTATUS _lsa_CREDRREADDOMAINCREDENTIALS(struct pipes_struct *p,
2704 struct lsa_CREDRREADDOMAINCREDENTIALS *r)
2706 p->rng_fault_state = True;
2707 return NT_STATUS_NOT_IMPLEMENTED;
2710 NTSTATUS _lsa_CREDRDELETE(struct pipes_struct *p, struct lsa_CREDRDELETE *r)
2712 p->rng_fault_state = True;
2713 return NT_STATUS_NOT_IMPLEMENTED;
2716 NTSTATUS _lsa_CREDRGETTARGETINFO(struct pipes_struct *p,
2717 struct lsa_CREDRGETTARGETINFO *r)
2719 p->rng_fault_state = True;
2720 return NT_STATUS_NOT_IMPLEMENTED;
2723 NTSTATUS _lsa_CREDRPROFILELOADED(struct pipes_struct *p,
2724 struct lsa_CREDRPROFILELOADED *r)
2726 p->rng_fault_state = True;
2727 return NT_STATUS_NOT_IMPLEMENTED;
2730 NTSTATUS _lsa_CREDRGETSESSIONTYPES(struct pipes_struct *p,
2731 struct lsa_CREDRGETSESSIONTYPES *r)
2733 p->rng_fault_state = True;
2734 return NT_STATUS_NOT_IMPLEMENTED;
2737 NTSTATUS _lsa_LSARREGISTERAUDITEVENT(struct pipes_struct *p,
2738 struct lsa_LSARREGISTERAUDITEVENT *r)
2740 p->rng_fault_state = True;
2741 return NT_STATUS_NOT_IMPLEMENTED;
2744 NTSTATUS _lsa_LSARGENAUDITEVENT(struct pipes_struct *p,
2745 struct lsa_LSARGENAUDITEVENT *r)
2747 p->rng_fault_state = True;
2748 return NT_STATUS_NOT_IMPLEMENTED;
2751 NTSTATUS _lsa_LSARUNREGISTERAUDITEVENT(struct pipes_struct *p,
2752 struct lsa_LSARUNREGISTERAUDITEVENT *r)
2754 p->rng_fault_state = True;
2755 return NT_STATUS_NOT_IMPLEMENTED;
2758 NTSTATUS _lsa_lsaRQueryForestTrustInformation(struct pipes_struct *p,
2759 struct lsa_lsaRQueryForestTrustInformation *r)
2761 p->rng_fault_state = True;
2762 return NT_STATUS_NOT_IMPLEMENTED;
2765 NTSTATUS _lsa_lsaRSetForestTrustInformation(struct pipes_struct *p,
2766 struct lsa_lsaRSetForestTrustInformation *r)
2768 p->rng_fault_state = True;
2769 return NT_STATUS_NOT_IMPLEMENTED;
2772 NTSTATUS _lsa_CREDRRENAME(struct pipes_struct *p,
2773 struct lsa_CREDRRENAME *r)
2775 p->rng_fault_state = True;
2776 return NT_STATUS_NOT_IMPLEMENTED;
2779 NTSTATUS _lsa_LSAROPENPOLICYSCE(struct pipes_struct *p,
2780 struct lsa_LSAROPENPOLICYSCE *r)
2782 p->rng_fault_state = True;
2783 return NT_STATUS_NOT_IMPLEMENTED;
2786 NTSTATUS _lsa_LSARADTREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p,
2787 struct lsa_LSARADTREGISTERSECURITYEVENTSOURCE *r)
2789 p->rng_fault_state = True;
2790 return NT_STATUS_NOT_IMPLEMENTED;
2793 NTSTATUS _lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE(struct pipes_struct *p,
2794 struct lsa_LSARADTUNREGISTERSECURITYEVENTSOURCE *r)
2796 p->rng_fault_state = True;
2797 return NT_STATUS_NOT_IMPLEMENTED;
2800 NTSTATUS _lsa_LSARADTREPORTSECURITYEVENT(struct pipes_struct *p,
2801 struct lsa_LSARADTREPORTSECURITYEVENT *r)
2803 p->rng_fault_state = True;
2804 return NT_STATUS_NOT_IMPLEMENTED;