diff options
Diffstat (limited to 'source4')
-rw-r--r-- | source4/librpc/idl/lsa.idl | 12 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_lsa.c | 17 | ||||
-rw-r--r-- | source4/librpc/ndr/ndr_lsa.h | 8 | ||||
-rw-r--r-- | source4/librpc/rpc/rpc_lsa.c | 8 | ||||
-rw-r--r-- | source4/torture/rpc/lsa.c | 32 |
5 files changed, 65 insertions, 12 deletions
diff --git a/source4/librpc/idl/lsa.idl b/source4/librpc/idl/lsa.idl index fc8fddd85d..d2410e770d 100644 --- a/source4/librpc/idl/lsa.idl +++ b/source4/librpc/idl/lsa.idl @@ -278,10 +278,20 @@ NTSTATUS SETSECRET (); /* Function: 0x1e */ NTSTATUS QUERYSECRET (); + /* Function: 0x1f */ NTSTATUS LOOKUPPRIVVALUE (); + + /* Function: 0x20 */ - NTSTATUS LOOKUPPRIVNAME (); + NTSTATUS lsa_LookupPrivName ( + [in,ref] policy_handle *handle, + [in] uint32 luid_high, + [in] uint32 luid_low, + [out] lsa_Name *name + ); + + /* Function: 0x21 */ NTSTATUS PRIV_GET_DISPNAME (); /* Function: 0x22 */ diff --git a/source4/librpc/ndr/ndr_lsa.c b/source4/librpc/ndr/ndr_lsa.c index 1b73482e9c..33596bf659 100644 --- a/source4/librpc/ndr/ndr_lsa.c +++ b/source4/librpc/ndr/ndr_lsa.c @@ -1127,14 +1127,27 @@ NTSTATUS ndr_pull_LOOKUPPRIVVALUE(struct ndr_pull *ndr, struct LOOKUPPRIVVALUE * return NT_STATUS_OK; } -NTSTATUS ndr_push_LOOKUPPRIVNAME(struct ndr_push *ndr, struct LOOKUPPRIVNAME *r) +NTSTATUS ndr_push_lsa_LookupPrivName(struct ndr_push *ndr, struct lsa_LookupPrivName *r) { + NDR_CHECK(ndr_push_policy_handle(ndr, r->in.handle)); + NDR_CHECK(ndr_push_uint32(ndr, r->in.luid_high)); + NDR_CHECK(ndr_push_uint32(ndr, r->in.luid_low)); return NT_STATUS_OK; } -NTSTATUS ndr_pull_LOOKUPPRIVNAME(struct ndr_pull *ndr, struct LOOKUPPRIVNAME *r) +NTSTATUS ndr_pull_lsa_LookupPrivName(struct ndr_pull *ndr, struct lsa_LookupPrivName *r) { + uint32 _ptr_name; + NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_name)); + if (_ptr_name) { + NDR_ALLOC(ndr, r->out.name); + } else { + r->out.name = NULL; + } + if (r->out.name) { + NDR_CHECK(ndr_pull_lsa_Name(ndr, NDR_SCALARS|NDR_BUFFERS, r->out.name)); + } NDR_CHECK(ndr_pull_NTSTATUS(ndr, &r->out.result)); return NT_STATUS_OK; diff --git a/source4/librpc/ndr/ndr_lsa.h b/source4/librpc/ndr/ndr_lsa.h index a3d395760c..402bbe8ca2 100644 --- a/source4/librpc/ndr/ndr_lsa.h +++ b/source4/librpc/ndr/ndr_lsa.h @@ -464,11 +464,15 @@ struct LOOKUPPRIVVALUE { }; -struct LOOKUPPRIVNAME { +struct lsa_LookupPrivName { struct { + struct policy_handle *handle; + uint32 luid_high; + uint32 luid_low; } in; struct { + struct lsa_Name *name; NTSTATUS result; } out; @@ -662,7 +666,7 @@ struct QUERYINFO2 { #define DCERPC_SETSECRET 29 #define DCERPC_QUERYSECRET 30 #define DCERPC_LOOKUPPRIVVALUE 31 -#define DCERPC_LOOKUPPRIVNAME 32 +#define DCERPC_LSA_LOOKUPPRIVNAME 32 #define DCERPC_PRIV_GET_DISPNAME 33 #define DCERPC_DELETEOBJECT 34 #define DCERPC_ENUMACCTWITHRIGHT 35 diff --git a/source4/librpc/rpc/rpc_lsa.c b/source4/librpc/rpc/rpc_lsa.c index dce1c7037e..1b5886b90f 100644 --- a/source4/librpc/rpc/rpc_lsa.c +++ b/source4/librpc/rpc/rpc_lsa.c @@ -451,12 +451,12 @@ NTSTATUS dcerpc_LOOKUPPRIVVALUE(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, stru return r->out.result; } -NTSTATUS dcerpc_LOOKUPPRIVNAME(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct LOOKUPPRIVNAME *r) +NTSTATUS dcerpc_lsa_LookupPrivName(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct lsa_LookupPrivName *r) { NTSTATUS status; - status = dcerpc_ndr_request(p, DCERPC_LOOKUPPRIVNAME, mem_ctx, - (ndr_push_fn_t) ndr_push_LOOKUPPRIVNAME, - (ndr_pull_fn_t) ndr_pull_LOOKUPPRIVNAME, + status = dcerpc_ndr_request(p, DCERPC_LSA_LOOKUPPRIVNAME, mem_ctx, + (ndr_push_fn_t) ndr_push_lsa_LookupPrivName, + (ndr_pull_fn_t) ndr_pull_lsa_LookupPrivName, r); if (!NT_STATUS_IS_OK(status)) { return status; diff --git a/source4/torture/rpc/lsa.c b/source4/torture/rpc/lsa.c index 0e316ff395..8dd18042f0 100644 --- a/source4/torture/rpc/lsa.c +++ b/source4/torture/rpc/lsa.c @@ -271,8 +271,32 @@ static BOOL test_LookupSids(struct dcerpc_pipe *p, return True; } +static BOOL test_LookupPrivName(struct dcerpc_pipe *p, + TALLOC_CTX *mem_ctx, + struct policy_handle *handle, + struct lsa_LUID *luid) +{ + NTSTATUS status; + struct lsa_LookupPrivName r; + + r.in.handle = handle; + r.in.luid_high = luid->high; + r.in.luid_low = luid->low; + + status = dcerpc_lsa_LookupPrivName(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("\nLookupPrivName failed - %s\n", nt_errstr(status)); + return False; + } + + printf(" '%s'\n", r.out.name->name); + + return True; +} + static BOOL test_EnumPrivsAccount(struct dcerpc_pipe *p, - TALLOC_CTX *mem_ctx, + TALLOC_CTX *mem_ctx, + struct policy_handle *handle, struct policy_handle *acct_handle) { NTSTATUS status; @@ -295,10 +319,12 @@ static BOOL test_EnumPrivsAccount(struct dcerpc_pipe *p, struct lsa_PrivilegeSet *privs = r.out.privs; int i; for (i=0;i<privs->count;i++) { - printf("luid=%08x-%08x attribute=0x%08x\n", + printf("luid=%08x-%08x attribute=0x%08x ", privs->set[i].luid.low, privs->set[i].luid.high, privs->set[i].attribute); + test_LookupPrivName(p, mem_ctx, handle, + &privs->set[i].luid); } } @@ -357,7 +383,7 @@ static BOOL test_OpenAccount(struct dcerpc_pipe *p, return False; } - if (!test_EnumPrivsAccount(p, mem_ctx, &acct_handle)) { + if (!test_EnumPrivsAccount(p, mem_ctx, handle, &acct_handle)) { return False; } |