1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

lsa_EnumSids() now works

This commit is contained in:
Andrew Tridgell 0001-01-01 00:00:00 +00:00
parent 9cf479873f
commit 25a8692fed
6 changed files with 180 additions and 8 deletions

View File

@ -108,3 +108,48 @@ NTSTATUS ndr_pull_lsa_OpenPolicy2(struct ndr_pull *ndr,
NDR_CHECK(ndr_pull_status(ndr, &r->out.status));
return NT_STATUS_OK;
}
/*
push a EnumSids
*/
NTSTATUS ndr_push_lsa_EnumSids(struct ndr_push *ndr,
struct lsa_EnumSids *r)
{
NDR_CHECK(ndr_push_policy_handle(ndr, r->in.handle));
NDR_CHECK(ndr_push_u32(ndr, r->in.start_at));
NDR_CHECK(ndr_push_u32(ndr, r->in.num_entries));
return NT_STATUS_OK;
}
/*
pull a EnumSids
*/
NTSTATUS ndr_pull_lsa_EnumSids(struct ndr_pull *ndr,
struct lsa_EnumSids *r)
{
uint32 nptrs, asize, i, ptr;
NDR_CHECK(ndr_pull_u32(ndr, &r->out.num_entries));
NDR_CHECK(ndr_pull_u32(ndr, &nptrs));
NDR_CHECK(ndr_pull_u32(ndr, &ptr));
if (!ptr) goto done;
NDR_CHECK(ndr_pull_u32(ndr, &asize));
NDR_ALLOC_N(ndr, r->out.sids, nptrs);
for (i=0;i<nptrs;i++) {
NDR_CHECK(ndr_pull_u32(ndr, &ptr));
if (ptr) {
NDR_ALLOC(ndr, r->out.sids[i]);
} else {
r->out.sids[i] = NULL;
}
}
for (i=0;i<nptrs;i++) {
if (r->out.sids[i]) NDR_CHECK(ndr_pull_dom_sid2(ndr, r->out.sids[i]));
}
done:
NDR_CHECK(ndr_pull_status(ndr, &r->out.status));
return NT_STATUS_OK;
}

View File

@ -57,3 +57,16 @@ struct lsa_OpenPolicy2 {
NTSTATUS status;
} out;
};
struct lsa_EnumSids {
struct {
struct policy_handle *handle;
uint32 start_at;
uint32 num_entries;
} in;
struct {
uint32 num_entries;
struct dom_sid **sids;
NTSTATUS status;
} out;
};

View File

@ -136,6 +136,16 @@ NTSTATUS ndr_pull_dom_sid(struct ndr_pull *ndr, struct dom_sid *sid)
return NT_STATUS_OK;
}
/*
parse a dom_sid2 - this is a dom_sid but with an extra copy of the num_auths field
*/
NTSTATUS ndr_pull_dom_sid2(struct ndr_pull *ndr, struct dom_sid *sid)
{
uint32 num_auths;
NDR_CHECK(ndr_pull_u32(ndr, &num_auths));
return ndr_pull_dom_sid(ndr, sid);
}
/*
parse a dom_sid offset and structure
*/

View File

@ -59,6 +59,9 @@ NTSTATUS dcerpc_pipe_open_smb(struct dcerpc_pipe *p, const char *pipe_name)
io.ntcreatex.in.fname = name;
mem_ctx = talloc_init("torture_rpc_connection");
if (!mem_ctx) {
return NT_STATUS_NO_MEMORY;
}
status = smb_raw_open(p->tree, mem_ctx, &io);
free(name);
talloc_destroy(mem_ctx);

View File

@ -35,7 +35,7 @@ NTSTATUS dcerpc_lsa_OpenPolicy(struct dcerpc_pipe *p,
NTSTATUS status;
TALLOC_CTX *mem_ctx;
mem_ctx = talloc_init("dcerpc_rpcecho_addone");
mem_ctx = talloc_init("dcerpc_lsa_openpolicy");
if (!mem_ctx) {
return NT_STATUS_NO_MEMORY;
}
@ -77,7 +77,7 @@ NTSTATUS dcerpc_lsa_OpenPolicy2(struct dcerpc_pipe *p,
NTSTATUS status;
TALLOC_CTX *mem_ctx;
mem_ctx = talloc_init("dcerpc_rpcecho_addone");
mem_ctx = talloc_init("dcerpc_lsa_openpolicy2");
if (!mem_ctx) {
return NT_STATUS_NO_MEMORY;
}
@ -104,3 +104,39 @@ done:
talloc_destroy(mem_ctx);
return status;
}
/*
EnumSids interface
*/
NTSTATUS dcerpc_lsa_EnumSids(struct dcerpc_pipe *p,
TALLOC_CTX *mem_ctx,
struct policy_handle *handle,
uint32 resume_handle,
uint32 *num_entries,
struct dom_sid ***sids)
{
struct lsa_EnumSids r;
NTSTATUS status;
/* fill the .in side of the call */
r.in.handle = handle;
r.in.start_at = 0;
r.in.num_entries = *num_entries;
/* make the call */
status = dcerpc_ndr_request(p, LSA_ENUM_ACCOUNTS, mem_ctx,
(ndr_push_fn_t) ndr_push_lsa_EnumSids,
(ndr_pull_fn_t) ndr_pull_lsa_EnumSids,
&r);
if (!NT_STATUS_IS_OK(status)) {
goto done;
}
/* and extract the .out parameters */
*num_entries = r.out.num_entries;
*sids = r.out.sids;
status = r.out.status;
done:
return status;
}

View File

@ -21,6 +21,39 @@
#include "includes.h"
/*
this really shouldn't be here ....
*/
static char *lsa_sid_string_talloc(TALLOC_CTX *mem_ctx, struct dom_sid *sid)
{
int i, ofs, maxlen;
uint32 ia;
char *ret;
if (!sid) {
return talloc_asprintf(mem_ctx, "(NULL SID)");
}
maxlen = sid->num_auths * 11 + 25;
ret = talloc(mem_ctx, maxlen);
if (!ret) return NULL;
ia = (sid->id_auth[5]) +
(sid->id_auth[4] << 8 ) +
(sid->id_auth[3] << 16) +
(sid->id_auth[2] << 24);
ofs = snprintf(ret, maxlen, "S-%u-%lu",
(unsigned int)sid->sid_rev_num, (unsigned long)ia);
for (i = 0; i < sid->num_auths; i++) {
ofs += snprintf(ret + ofs, maxlen - ofs, "-%lu", (unsigned long)sid->sub_auths[i]);
}
return ret;
}
static BOOL test_OpenPolicy(struct dcerpc_pipe *p)
{
struct lsa_ObjectAttribute attr;
@ -28,7 +61,7 @@ static BOOL test_OpenPolicy(struct dcerpc_pipe *p)
struct lsa_QosInfo qos;
NTSTATUS status;
printf("testing OpenPolicy\n");
printf("\ntesting OpenPolicy\n");
qos.impersonation_level = 2;
qos.context_mode = 1;
@ -54,14 +87,13 @@ static BOOL test_OpenPolicy(struct dcerpc_pipe *p)
}
static BOOL test_OpenPolicy2(struct dcerpc_pipe *p)
static BOOL test_OpenPolicy2(struct dcerpc_pipe *p, struct policy_handle *handle)
{
struct lsa_ObjectAttribute attr;
struct policy_handle handle;
struct lsa_QosInfo qos;
NTSTATUS status;
printf("testing OpenPolicy2\n");
printf("\ntesting OpenPolicy2\n");
qos.impersonation_level = 2;
qos.context_mode = 1;
@ -77,7 +109,7 @@ static BOOL test_OpenPolicy2(struct dcerpc_pipe *p)
"\\",
&attr,
SEC_RIGHTS_MAXIMUM_ALLOWED,
&handle);
handle);
if (!NT_STATUS_IS_OK(status)) {
printf("OpenPolicy2 failed - %s\n", nt_errstr(status));
return False;
@ -86,12 +118,41 @@ static BOOL test_OpenPolicy2(struct dcerpc_pipe *p)
return True;
}
static BOOL test_EnumSids(struct dcerpc_pipe *p,
TALLOC_CTX *mem_ctx,
struct policy_handle *handle)
{
NTSTATUS status;
struct dom_sid **sids;
uint32 num_entries = 100;
int i;
printf("\ntesting EnumSids\n");
status = dcerpc_lsa_EnumSids(p, mem_ctx, handle, 0, &num_entries, &sids);
if (!NT_STATUS_IS_OK(status)) {
printf("EnumSids failed - %s\n", nt_errstr(status));
return False;
}
printf("Got %d sids\n", num_entries);
for (i=0;i<num_entries;i++) {
printf("%s\n", lsa_sid_string_talloc(mem_ctx, sids[i]));
}
return True;
}
BOOL torture_rpc_lsa(int dummy)
{
NTSTATUS status;
struct dcerpc_pipe *p;
TALLOC_CTX *mem_ctx;
BOOL ret = True;
struct policy_handle handle;
mem_ctx = talloc_init("torture_rpc_lsa");
@ -104,10 +165,14 @@ BOOL torture_rpc_lsa(int dummy)
ret = False;
}
if (!test_OpenPolicy2(p)) {
if (!test_OpenPolicy2(p, &handle)) {
ret = False;
}
if (!test_EnumSids(p, mem_ctx, &handle)) {
ret = False;
}
torture_rpc_close(p);
return ret;