1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

LsaLookupNames client call (first used as lookupnames command in rpcclient).

(This used to be commit 68342a29a892e515cf2b22d759476d61944bcd59)
This commit is contained in:
Luke Leighton 1998-11-25 19:57:04 +00:00
parent 73106d9bae
commit 59d4087160
13 changed files with 380 additions and 131 deletions

View File

@ -1252,11 +1252,11 @@ BOOL pm_process( char *FileName,
/*The following definitions come from passdb/ldap.c */
struct passdb_ops *ldap_initialize_password_db(void);
struct passdb_ops *ldap_initialise_password_db(void);
/*The following definitions come from passdb/nispass.c */
struct passdb_ops *nisplus_initialize_password_db(void);
struct passdb_ops *nisplus_initialise_password_db(void);
/*The following definitions come from passdb/pass_check.c */
@ -1412,6 +1412,12 @@ BOOL cli_nt_logoff(struct cli_state *cli, NET_ID_INFO_CTR *ctr);
BOOL do_lsa_open_policy(struct cli_state *cli,
char *server_name, POLICY_HND *hnd,
BOOL sec_qos);
BOOL do_lsa_lookup_names(struct cli_state *cli,
POLICY_HND *hnd,
int num_names,
char **names,
DOM_SID **sids,
int *num_sids);
BOOL do_lsa_lookup_sids(struct cli_state *cli,
POLICY_HND *hnd,
int num_sids,
@ -1591,8 +1597,10 @@ void make_q_lookup_sids(LSA_Q_LOOKUP_SIDS *q_l, POLICY_HND *hnd,
uint16 level);
void lsa_io_q_lookup_sids(char *desc, LSA_Q_LOOKUP_SIDS *q_s, prs_struct *ps, int depth);
void lsa_io_r_lookup_sids(char *desc, LSA_R_LOOKUP_SIDS *r_s, prs_struct *ps, int depth);
void lsa_io_q_lookup_rids(char *desc, LSA_Q_LOOKUP_RIDS *q_r, prs_struct *ps, int depth);
void lsa_io_r_lookup_rids(char *desc, LSA_R_LOOKUP_RIDS *r_r, prs_struct *ps, int depth);
void make_q_lookup_names(LSA_Q_LOOKUP_NAMES *q_l, POLICY_HND *hnd,
int num_names, char **names);
void lsa_io_q_lookup_names(char *desc, LSA_Q_LOOKUP_NAMES *q_r, prs_struct *ps, int depth);
void lsa_io_r_lookup_names(char *desc, LSA_R_LOOKUP_NAMES *r_r, prs_struct *ps, int depth);
void make_lsa_q_close(LSA_Q_CLOSE *q_c, POLICY_HND *hnd);
void lsa_io_q_close(char *desc, LSA_Q_CLOSE *q_c, prs_struct *ps, int depth);
void lsa_io_r_close(char *desc, LSA_R_CLOSE *r_c, prs_struct *ps, int depth);
@ -2283,6 +2291,7 @@ BOOL api_wkssvc_rpc(pipes_struct *p, prs_struct *data);
/*The following definitions come from rpcclient/cmd_lsarpc.c */
void cmd_lsa_query_info(struct client_info *info);
void cmd_lsa_lookup_names(struct client_info *info);
void cmd_lsa_lookup_sids(struct client_info *info);
/*The following definitions come from rpcclient/cmd_netlogon.c */

View File

@ -48,9 +48,6 @@ enum SID_NAME_USE
#define LSA_OPENPOLICY2 0x2c
#define LSA_OPENSECRET 0x1C
/* XXXX these are here to get a compile! */
#define LSA_LOOKUPRIDS 0xFD
#define LSA_MAX_GROUPS 32
#define LSA_MAX_SIDS 32
@ -290,37 +287,37 @@ typedef struct lsa_r_lookup_sids
} LSA_R_LOOKUP_SIDS;
#define UNKNOWN_LEN 1
/* LSA_Q_LOOKUP_RIDS - LSA Lookup RIDs */
typedef struct lsa_q_lookup_rids
/* LSA_Q_LOOKUP_NAMES - LSA Lookup NAMEs */
typedef struct lsa_q_lookup_names
{
POLICY_HND pol; /* policy handle */
uint32 num_entries;
uint32 num_entries2;
uint32 buffer_dom_sid; /* undocumented domain SID buffer pointer */
uint32 buffer_dom_name; /* undocumented domain name buffer pointer */
UNISTR3 lookup_name[MAX_LOOKUP_SIDS]; /* names to be looked up */
uint8 undoc[UNKNOWN_LEN]; /* completely undocumented bytes of unknown length */
UNIHDR hdr_name[MAX_LOOKUP_SIDS]; /* name buffer pointers */
UNISTR2 uni_name[MAX_LOOKUP_SIDS]; /* names to be looked up */
} LSA_Q_LOOKUP_RIDS;
uint32 num_trans_entries;
uint32 ptr_trans_sids; /* undocumented domain SID buffer pointer */
uint32 lookup_level;
uint32 mapped_count;
/* LSA_R_LOOKUP_RIDS - response to LSA Lookup RIDs by name */
typedef struct lsa_r_lookup_rids
} LSA_Q_LOOKUP_NAMES;
/* LSA_R_LOOKUP_NAMES - response to LSA Lookup NAMEs by name */
typedef struct lsa_r_lookup_names
{
DOM_R_REF dom_ref; /* domain reference info */
DOM_R_REF *dom_ref; /* domain reference info */
uint32 num_entries;
uint32 undoc_buffer; /* undocumented buffer pointer */
uint32 num_entries;
uint32 undoc_buffer; /* undocumented buffer pointer */
uint32 num_entries2;
DOM_RID2 *dom_rid; /* domain RIDs being looked up */
uint32 num_entries2;
DOM_RID2 dom_rid[MAX_LOOKUP_SIDS]; /* domain RIDs being looked up */
uint32 mapped_count;
uint32 num_entries3;
uint32 status; /* return code */
uint32 status; /* return code */
} LSA_R_LOOKUP_RIDS;
} LSA_R_LOOKUP_NAMES;
#endif /* _RPC_LSA_H */

View File

@ -188,29 +188,28 @@ typedef struct unistr3_info
/* DOM_RID2 - domain RID structure for ntlsa pipe */
typedef struct domrid2_info
{
uint32 type; /* value is 5 */
uint32 undoc; /* value is non-zero */
uint32 rid;
uint32 rid_idx; /* don't know what this is */
uint8 type; /* value is SID_NAME_USE enum */
uint32 rid;
uint32 rid_idx; /* referenced domain index */
} DOM_RID2;
/* DOM_RID3 - domain RID structure for samr pipe */
typedef struct domrid3_info
{
uint32 rid; /* domain-relative (to a SID) id */
uint32 type1; /* value is 0x1 */
uint32 ptr_type; /* undocumented pointer */
uint32 type2; /* value is 0x1 */
uint32 rid; /* domain-relative (to a SID) id */
uint32 type1; /* value is 0x1 */
uint32 ptr_type; /* undocumented pointer */
uint32 type2; /* value is 0x1 */
} DOM_RID3;
/* DOM_RID4 - rid + user attributes */
typedef struct domrid4_info
{
uint32 unknown;
uint16 attr;
uint32 rid; /* user RID */
uint32 unknown;
uint16 attr;
uint32 rid; /* user RID */
} DOM_RID4;

View File

@ -195,9 +195,9 @@ static int make_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
}
/***************************************************************************
make_reply_lookup_rids
make_reply_lookup_names
***************************************************************************/
static void make_reply_lookup_rids(LSA_R_LOOKUP_RIDS *r_l,
static void make_reply_lookup_names(LSA_R_LOOKUP_NAMES *r_l,
int num_entries,
DOM_SID dom_sids [MAX_LOOKUP_SIDS],
uint8 dom_types[MAX_LOOKUP_SIDS])
@ -338,24 +338,24 @@ static void lsa_reply_lookup_sids(prs_struct *rdata,
}
/***************************************************************************
lsa_reply_lookup_rids
lsa_reply_lookup_names
***************************************************************************/
static void lsa_reply_lookup_rids(prs_struct *rdata,
static void lsa_reply_lookup_names(prs_struct *rdata,
int num_entries,
DOM_SID dom_sids [MAX_LOOKUP_SIDS],
uint8 dom_types[MAX_LOOKUP_SIDS])
{
LSA_R_LOOKUP_RIDS r_l;
LSA_R_LOOKUP_NAMES r_l;
ZERO_STRUCT(r_l);
/* set up the LSA Lookup RIDs response */
make_reply_lookup_rids(&r_l, num_entries, dom_sids, dom_types);
make_reply_lookup_names(&r_l, num_entries, dom_sids, dom_types);
r_l.status = 0x0;
/* store the response in the SMB stream */
lsa_io_r_lookup_rids("", &r_l, rdata, 0);
lsa_io_r_lookup_names("", &r_l, rdata, 0);
}
/***************************************************************************
@ -478,7 +478,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
prs_struct *rdata )
{
int i;
LSA_Q_LOOKUP_RIDS q_l;
LSA_Q_LOOKUP_NAMES q_l;
DOM_SID dom_sids [MAX_LOOKUP_SIDS];
uint8 dom_types[MAX_LOOKUP_SIDS];
@ -486,15 +486,15 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
ZERO_ARRAY(dom_sids);
/* grab the info class and policy handle */
lsa_io_q_lookup_rids("", &q_l, data, 0);
lsa_io_q_lookup_names("", &q_l, data, 0);
SMB_ASSERT_ARRAY(q_l.lookup_name, q_l.num_entries);
SMB_ASSERT_ARRAY(q_l.uni_name, q_l.num_entries);
/* convert received RIDs to strings, so we can do them. */
for (i = 0; i < q_l.num_entries; i++)
{
fstring name;
fstrcpy(name, unistr2(q_l.lookup_name[i].str.buffer));
fstrcpy(name, unistr2_to_str(&q_l.uni_name[i]));
if (!lookup_name(name, &dom_sids[i], &dom_types[i]))
{
@ -503,7 +503,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
}
/* construct reply. return status is always 0x0 */
lsa_reply_lookup_rids(rdata,
lsa_reply_lookup_names(rdata,
q_l.num_entries,
dom_sids, /* text-converted SIDs */
dom_types); /* SID_NAME_USE types */

View File

@ -111,7 +111,8 @@ struct smb_passwd *iterate_getsmbpwuid(uid_t smb_userid)
}
while ((pwd = getsmbpwent(fp)) != NULL && pwd->smb_userid != smb_userid)
;
{
}
if (pwd != NULL)
{
@ -144,7 +145,8 @@ struct smb_passwd *iterate_getsmbpwnam(char *name)
}
while ((pwd = getsmbpwent(fp)) != NULL && !strequal(pwd->smb_name, name))
;
{
}
if (pwd != NULL)
{
@ -349,7 +351,8 @@ struct sam_passwd *iterate_getsam21pwuid(uid_t uid)
}
while ((pwd = getsam21pwent(fp)) != NULL && pwd->smb_userid != uid)
;
{
}
if (pwd != NULL)
{
@ -514,30 +517,33 @@ struct sam_passwd *pwdb_smb_to_sam(struct smb_passwd *user)
char *pwdb_encode_acct_ctrl(uint16 acct_ctrl, size_t length)
{
static fstring acct_str;
size_t i = 0;
static fstring acct_str;
size_t i = 0;
acct_str[i++] = '[';
acct_str[i++] = '[';
if (acct_ctrl & ACB_PWNOTREQ ) acct_str[i++] = 'N';
if (acct_ctrl & ACB_DISABLED ) acct_str[i++] = 'D';
if (acct_ctrl & ACB_HOMDIRREQ) acct_str[i++] = 'H';
if (acct_ctrl & ACB_TEMPDUP ) acct_str[i++] = 'T';
if (acct_ctrl & ACB_NORMAL ) acct_str[i++] = 'U';
if (acct_ctrl & ACB_MNS ) acct_str[i++] = 'M';
if (acct_ctrl & ACB_WSTRUST ) acct_str[i++] = 'W';
if (acct_ctrl & ACB_SVRTRUST ) acct_str[i++] = 'S';
if (acct_ctrl & ACB_AUTOLOCK ) acct_str[i++] = 'L';
if (acct_ctrl & ACB_PWNOEXP ) acct_str[i++] = 'X';
if (acct_ctrl & ACB_DOMTRUST ) acct_str[i++] = 'I';
if (acct_ctrl & ACB_PWNOTREQ ) acct_str[i++] = 'N';
if (acct_ctrl & ACB_DISABLED ) acct_str[i++] = 'D';
if (acct_ctrl & ACB_HOMDIRREQ) acct_str[i++] = 'H';
if (acct_ctrl & ACB_TEMPDUP ) acct_str[i++] = 'T';
if (acct_ctrl & ACB_NORMAL ) acct_str[i++] = 'U';
if (acct_ctrl & ACB_MNS ) acct_str[i++] = 'M';
if (acct_ctrl & ACB_WSTRUST ) acct_str[i++] = 'W';
if (acct_ctrl & ACB_SVRTRUST ) acct_str[i++] = 'S';
if (acct_ctrl & ACB_AUTOLOCK ) acct_str[i++] = 'L';
if (acct_ctrl & ACB_PWNOEXP ) acct_str[i++] = 'X';
if (acct_ctrl & ACB_DOMTRUST ) acct_str[i++] = 'I';
for ( ; i < length - 2 ; i++ ) { acct_str[i] = ' '; }
for ( ; i < length - 2 ; i++ )
{
acct_str[i] = ' ';
}
i = length - 2;
acct_str[i++] = ']';
acct_str[i++] = '\0';
i = length - 2;
acct_str[i++] = ']';
acct_str[i++] = '\0';
return acct_str;
return acct_str;
}
/**********************************************************
@ -575,7 +581,7 @@ uint16 pwdb_decode_acct_ctrl(const char *p)
case 'L': { acct_ctrl |= ACB_AUTOLOCK ; break; /* 'L'ocked account. */ }
case 'X': { acct_ctrl |= ACB_PWNOEXP ; break; /* No 'X'piry on password */ }
case 'I': { acct_ctrl |= ACB_DOMTRUST ; break; /* 'I'nterdomain trust account. */ }
case ' ': { break; }
case ' ': { break; }
case ':':
case '\n':
case '\0':

View File

@ -98,6 +98,119 @@ BOOL do_lsa_open_policy(struct cli_state *cli,
return valid_pol;
}
/****************************************************************************
do a LSA Lookup Names
****************************************************************************/
BOOL do_lsa_lookup_names(struct cli_state *cli,
POLICY_HND *hnd,
int num_names,
char **names,
DOM_SID **sids,
int *num_sids)
{
prs_struct rbuf;
prs_struct buf;
LSA_Q_LOOKUP_NAMES q_l;
BOOL valid_response = False;
if (hnd == NULL || num_sids == 0 || sids == NULL) return False;
prs_init(&buf , 1024, 4, SAFETY_MARGIN, False);
prs_init(&rbuf, 0 , 4, SAFETY_MARGIN, True );
/* create and send a MSRPC command with api LSA_LOOKUP_NAMES */
DEBUG(4,("LSA Lookup NAMEs\n"));
/* store the parameters */
make_q_lookup_names(&q_l, hnd, num_names, names);
/* turn parameters into data stream */
lsa_io_q_lookup_names("", &q_l, &buf, 0);
/* send the data on \PIPE\ */
if (rpc_api_pipe_req(cli, LSA_LOOKUPNAMES, &buf, &rbuf))
{
LSA_R_LOOKUP_NAMES r_l;
DOM_R_REF ref;
DOM_RID2 t_rids[MAX_LOOKUP_SIDS];
BOOL p;
ZERO_STRUCT(ref);
ZERO_STRUCT(t_rids);
r_l.dom_ref = &ref;
r_l.dom_rid = t_rids;
lsa_io_r_lookup_names("", &r_l, &rbuf, 0);
p = rbuf.offset != 0;
if (p && r_l.status != 0)
{
/* report error code */
DEBUG(0,("LSA_LOOKUP_NAMES: %s\n", get_nt_error_msg(r_l.status)));
p = False;
}
if (p)
{
if (r_l.undoc_buffer != 0 && ref.undoc_buffer != 0)
{
valid_response = True;
}
}
if (num_sids != NULL && valid_response)
{
(*num_sids) = r_l.num_entries;
}
if (valid_response)
{
int i;
for (i = 0; i < r_l.num_entries; i++)
{
if (t_rids[i].rid_idx >= ref.num_ref_doms_1 &&
t_rids[i].rid_idx != 0xffffffff)
{
DEBUG(0,("LSA_LOOKUP_NAMES: domain index %d out of bounds\n",
t_rids[i].rid_idx));
valid_response = False;
break;
}
}
}
if (sids != NULL && valid_response && r_l.num_entries != 0)
{
(*sids) = (DOM_SID*)malloc((*num_sids) * sizeof(DOM_SID));
}
if (sids != NULL && (*sids) != NULL)
{
int i;
/* take each name, construct a SID */
for (i = 0; i < (*num_sids); i++)
{
uint32 dom_idx = t_rids[i].rid_idx;
DOM_SID *sid = &(*sids)[i];
if (dom_idx != 0xffffffff)
{
sid_copy(sid, &ref.ref_dom[dom_idx].ref_dom.sid);
}
else
{
ZERO_STRUCTP(sid);
}
}
}
}
prs_mem_free(&rbuf);
prs_mem_free(&buf );
return valid_response;
}
/****************************************************************************
do a LSA Lookup SIDs
****************************************************************************/
@ -190,13 +303,21 @@ BOOL do_lsa_lookup_sids(struct cli_state *cli,
fstring dom_name;
fstring full_name;
uint32 dom_idx = t_names.name[i].domain_idx;
fstrcpy(dom_name, unistr2(ref.ref_dom[dom_idx].uni_dom_name.buffer));
fstrcpy(name , unistr2(t_names.uni_name[i].buffer));
slprintf(full_name, sizeof(full_name), "\\%s\\%s",
dom_name, name);
(*names)[i] = strdup(full_name);
if (dom_idx != 0xffffffff)
{
fstrcpy(dom_name, unistr2(ref.ref_dom[dom_idx].uni_dom_name.buffer));
fstrcpy(name , unistr2(t_names.uni_name[i].buffer));
slprintf(full_name, sizeof(full_name), "\\%s\\%s",
dom_name, name);
(*names)[i] = strdup(full_name);
}
else
{
(*names)[i] = NULL;
}
}
}
}

View File

@ -563,7 +563,7 @@ static void lsa_io_sid_enum(char *desc, LSA_SID_ENUM *sen,
}
/*******************************************************************
makes an LSA_R_ENUM_TRUST_DOM structure.
makes a structure.
********************************************************************/
void make_q_lookup_sids(LSA_Q_LOOKUP_SIDS *q_l, POLICY_HND *hnd,
int num_sids, DOM_SID **sids,
@ -571,7 +571,7 @@ void make_q_lookup_sids(LSA_Q_LOOKUP_SIDS *q_l, POLICY_HND *hnd,
{
if (q_l == NULL) return;
DEBUG(5,("make_r_enum_trust_dom\n"));
DEBUG(5,("make_q_lookup_sids\n"));
memcpy(&(q_l->pol), hnd, sizeof(q_l->pol));
make_lsa_sid_enum(&(q_l->sids), num_sids, sids);
@ -667,16 +667,47 @@ void lsa_io_r_lookup_sids(char *desc, LSA_R_LOOKUP_SIDS *r_s, prs_struct *ps, i
prs_uint32("status ", ps, depth, &(r_s->status));
}
/*******************************************************************
makes a structure.
********************************************************************/
void make_q_lookup_names(LSA_Q_LOOKUP_NAMES *q_l, POLICY_HND *hnd,
int num_names, char **names)
{
int i;
if (q_l == NULL) return;
DEBUG(5,("make_q_lookup_names\n"));
memcpy(&(q_l->pol), hnd, sizeof(q_l->pol));
SMB_ASSERT_ARRAY(q_l->uni_name, q_l->num_entries);
q_l->num_entries = num_names;
q_l->num_entries2 = num_names;
for (i = 0; i < num_names; i++)
{
int len = strlen(names[i]);
make_uni_hdr(&q_l->hdr_name[i], len, len, len != 0);
make_unistr2(&q_l->uni_name[i], names[i], len);
}
q_l->num_trans_entries = 0;
q_l->ptr_trans_sids = 0;
q_l->lookup_level = 1;
q_l->mapped_count = 0;
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
void lsa_io_q_lookup_rids(char *desc, LSA_Q_LOOKUP_RIDS *q_r, prs_struct *ps, int depth)
void lsa_io_q_lookup_names(char *desc, LSA_Q_LOOKUP_NAMES *q_r, prs_struct *ps, int depth)
{
int i;
if (q_r == NULL) return;
prs_debug(ps, depth, desc, "lsa_io_q_lookup_rids");
prs_debug(ps, depth, desc, "lsa_io_q_lookup_names");
depth++;
prs_align(ps);
@ -685,47 +716,52 @@ void lsa_io_q_lookup_rids(char *desc, LSA_Q_LOOKUP_RIDS *q_r, prs_struct *ps, i
prs_uint32("num_entries ", ps, depth, &(q_r->num_entries));
prs_uint32("num_entries2 ", ps, depth, &(q_r->num_entries2));
prs_uint32("buffer_dom_sid ", ps, depth, &(q_r->buffer_dom_sid)); /* undocumented domain SID buffer pointer */
prs_uint32("buffer_dom_name", ps, depth, &(q_r->buffer_dom_name)); /* undocumented domain name buffer pointer */
SMB_ASSERT_ARRAY(q_r->lookup_name, q_r->num_entries);
SMB_ASSERT_ARRAY(q_r->uni_name, q_r->num_entries);
for (i = 0; i < q_r->num_entries; i++)
{
smb_io_unistr3("dom_name", &(q_r->lookup_name[i]), ps, depth); /* names to be looked up */
smb_io_unihdr("hdr_name", &(q_r->hdr_name[i]), ps, depth); /* pointer names */
}
prs_uint8s (False, "undoc ", ps, depth, q_r->undoc, UNKNOWN_LEN);
for (i = 0; i < q_r->num_entries; i++)
{
smb_io_unistr2("dom_name", &(q_r->uni_name[i]), q_r->hdr_name[i].buffer, ps, depth); /* names to be looked up */
prs_align(ps);
}
prs_uint32("num_trans_entries ", ps, depth, &(q_r->num_trans_entries));
prs_uint32("ptr_trans_sids ", ps, depth, &(q_r->ptr_trans_sids));
prs_uint32("lookup_level ", ps, depth, &(q_r->lookup_level ));
prs_uint32("mapped_count ", ps, depth, &(q_r->mapped_count ));
}
/*******************************************************************
reads or writes a structure.
********************************************************************/
void lsa_io_r_lookup_rids(char *desc, LSA_R_LOOKUP_RIDS *r_r, prs_struct *ps, int depth)
void lsa_io_r_lookup_names(char *desc, LSA_R_LOOKUP_NAMES *r_r, prs_struct *ps, int depth)
{
int i;
if (r_r == NULL) return;
prs_debug(ps, depth, desc, "lsa_io_r_lookup_rids");
prs_debug(ps, depth, desc, "lsa_io_r_lookup_names");
depth++;
prs_align(ps);
lsa_io_dom_r_ref("", &(r_r->dom_ref), ps, depth); /* domain reference info */
lsa_io_dom_r_ref("", r_r->dom_ref, ps, depth); /* domain reference info */
prs_uint32("num_entries ", ps, depth, &(r_r->num_entries));
prs_uint32("undoc_buffer", ps, depth, &(r_r->undoc_buffer));
prs_uint32("num_entries2", ps, depth, &(r_r->num_entries2));
SMB_ASSERT_ARRAY(r_r->dom_rid, r_r->num_entries2);
for (i = 0; i < r_r->num_entries2; i++)
{
smb_io_dom_rid2("", &(r_r->dom_rid[i]), ps, depth); /* domain RIDs being looked up */
}
prs_uint32("num_entries3", ps, depth, &(r_r->num_entries3));
prs_uint32("mapped_count", ps, depth, &(r_r->mapped_count));
prs_uint32("status ", ps, depth, &(r_r->status));
}

View File

@ -674,7 +674,6 @@ creates a DOM_RID2 structure.
void make_dom_rid2(DOM_RID2 *rid2, uint32 rid, uint8 type)
{
rid2->type = type;
rid2->undoc = 0x5;
rid2->rid = rid;
rid2->rid_idx = 0;
}
@ -691,14 +690,8 @@ void smb_io_dom_rid2(char *desc, DOM_RID2 *rid2, prs_struct *ps, int depth)
prs_align(ps);
/* should be value 5, so enforce it */
rid2->type = 5;
/* should be value 5, so enforce it */
rid2->undoc = 5;
prs_uint32("type ", ps, depth, &(rid2->type));
prs_uint32("undoc ", ps, depth, &(rid2->undoc ));
prs_uint8("type ", ps, depth, &(rid2->type));
prs_align(ps);
prs_uint32("rid ", ps, depth, &(rid2->rid ));
prs_uint32("rid_idx", ps, depth, &(rid2->rid_idx ));
}

View File

@ -195,9 +195,9 @@ static int make_dom_ref(DOM_R_REF *ref, char *dom_name, DOM_SID *dom_sid)
}
/***************************************************************************
make_reply_lookup_rids
make_reply_lookup_names
***************************************************************************/
static void make_reply_lookup_rids(LSA_R_LOOKUP_RIDS *r_l,
static void make_reply_lookup_names(LSA_R_LOOKUP_NAMES *r_l,
int num_entries,
DOM_SID dom_sids [MAX_LOOKUP_SIDS],
uint8 dom_types[MAX_LOOKUP_SIDS])
@ -338,24 +338,24 @@ static void lsa_reply_lookup_sids(prs_struct *rdata,
}
/***************************************************************************
lsa_reply_lookup_rids
lsa_reply_lookup_names
***************************************************************************/
static void lsa_reply_lookup_rids(prs_struct *rdata,
static void lsa_reply_lookup_names(prs_struct *rdata,
int num_entries,
DOM_SID dom_sids [MAX_LOOKUP_SIDS],
uint8 dom_types[MAX_LOOKUP_SIDS])
{
LSA_R_LOOKUP_RIDS r_l;
LSA_R_LOOKUP_NAMES r_l;
ZERO_STRUCT(r_l);
/* set up the LSA Lookup RIDs response */
make_reply_lookup_rids(&r_l, num_entries, dom_sids, dom_types);
make_reply_lookup_names(&r_l, num_entries, dom_sids, dom_types);
r_l.status = 0x0;
/* store the response in the SMB stream */
lsa_io_r_lookup_rids("", &r_l, rdata, 0);
lsa_io_r_lookup_names("", &r_l, rdata, 0);
}
/***************************************************************************
@ -478,7 +478,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
prs_struct *rdata )
{
int i;
LSA_Q_LOOKUP_RIDS q_l;
LSA_Q_LOOKUP_NAMES q_l;
DOM_SID dom_sids [MAX_LOOKUP_SIDS];
uint8 dom_types[MAX_LOOKUP_SIDS];
@ -486,15 +486,15 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
ZERO_ARRAY(dom_sids);
/* grab the info class and policy handle */
lsa_io_q_lookup_rids("", &q_l, data, 0);
lsa_io_q_lookup_names("", &q_l, data, 0);
SMB_ASSERT_ARRAY(q_l.lookup_name, q_l.num_entries);
SMB_ASSERT_ARRAY(q_l.uni_name, q_l.num_entries);
/* convert received RIDs to strings, so we can do them. */
for (i = 0; i < q_l.num_entries; i++)
{
fstring name;
fstrcpy(name, unistr2(q_l.lookup_name[i].str.buffer));
fstrcpy(name, unistr2_to_str(&q_l.uni_name[i]));
if (!lookup_name(name, &dom_sids[i], &dom_types[i]))
{
@ -503,7 +503,7 @@ static void api_lsa_lookup_names( uint16 vuid, prs_struct *data,
}
/* construct reply. return status is always 0x0 */
lsa_reply_lookup_rids(rdata,
lsa_reply_lookup_names(rdata,
q_l.num_entries,
dom_sids, /* text-converted SIDs */
dom_types); /* SID_NAME_USE types */

View File

@ -432,10 +432,6 @@ Error was %s\n", sid_file, strerror(errno) ));
***************************************************************************/
BOOL map_domain_name_to_sid(DOM_SID *sid, char **nt_domain)
{
fstring sid_str;
sid_to_string(sid_str, sid);
DEBUG(5,("map_domain_name_to_sid: %s\n", sid_str));
if (nt_domain == NULL)
{
*sid = global_sam_sid;
@ -451,6 +447,16 @@ BOOL map_domain_name_to_sid(DOM_SID *sid, char **nt_domain)
return True;
}
if ((*nt_domain)[0] == 0)
{
DEBUG(5,("map_domain_name_to_sid: overriding blank name to %s\n",
global_sam_name));
free(*nt_domain);
(*nt_domain) = strdup(global_sam_name);
*sid = global_sam_sid;
return True;
}
if (strequal((*nt_domain), global_sam_name))
{
*sid = global_sam_sid;

View File

@ -121,7 +121,97 @@ void cmd_lsa_query_info(struct client_info *info)
}
/****************************************************************************
nt lsa query
lookup names
****************************************************************************/
void cmd_lsa_lookup_names(struct client_info *info)
{
fstring temp;
int i;
fstring srv_name;
int num_names = 0;
char *names[10];
DOM_SID *sids;
int num_sids = 0;
#if 0
DOM_SID sid[10];
DOM_SID *sids[10];
#endif
BOOL res = True;
fstrcpy(srv_name, "\\\\");
fstrcat(srv_name, info->myhostname);
strupper(srv_name);
DEBUG(4,("cmd_lsa_lookup_names: server: %s\n", srv_name));
while (num_names < 10 && next_token(NULL, temp, NULL, sizeof(temp)))
{
names[num_names] = strdup(temp);
num_names++;
}
if (num_names == 0)
{
fprintf(out_hnd, "lookupnames <name> [<name> ...]\n");
return;
}
/* open LSARPC session. */
res = res ? cli_nt_session_open(smb_cli, PIPE_LSARPC) : False;
/* lookup domain controller; receive a policy handle */
res = res ? do_lsa_open_policy(smb_cli,
srv_name,
&info->dom.lsa_info_pol, True) : False;
/* send lsa lookup sids call */
res = res ? do_lsa_lookup_names(smb_cli,
&info->dom.lsa_info_pol,
num_names, names,
&sids, &num_sids) : False;
res = res ? do_lsa_close(smb_cli, &info->dom.lsa_info_pol) : False;
/* close the session */
cli_nt_session_close(smb_cli);
if (res)
{
DEBUG(5,("cmd_lsa_lookup_names: query succeeded\n"));
}
else
{
DEBUG(5,("cmd_lsa_lookup_names: query failed\n"));
}
if (sids != NULL)
{
fprintf(out_hnd,"Lookup Names:\n");
for (i = 0; i < num_sids; i++)
{
sid_to_string(temp, &sids[i]);
fprintf(out_hnd, "SID: %s -> %s\n", names[i], temp);
#if 0
if (sids[i] != NULL)
{
free(sids[i]);
}
#endif
}
free(sids);
}
for (i = 0; i < num_names; i++)
{
if (names[i] != NULL)
{
free(names[i]);
}
}
}
/****************************************************************************
lookup sids
****************************************************************************/
void cmd_lsa_lookup_sids(struct client_info *info)
{

View File

@ -122,6 +122,7 @@ struct
{"srvfiles", cmd_srv_enum_files, "List files on a server"},
{"lsaquery", cmd_lsa_query_info, "Query Info Policy (domain member or server)"},
{"lookupsids", cmd_lsa_lookup_sids, "Resolve names from SIDs"},
{"lookupnames",cmd_lsa_lookup_names, "Resolve SIDs from names"},
{"enumusers", cmd_sam_enum_users, "SAM User Database Query (experimental!)"},
{"ntpass", cmd_sam_ntchange_pwd, "NT SAM Password Change"},
{"samuser", cmd_sam_query_user, "<username> SAM User Query (experimental!)"},

View File

@ -207,16 +207,9 @@ failed. Error was %s.\n", grp->unix_name, strerror(errno) ));
grp->nt_domain));
return False;
}
DEBUG(0,("unix_name_to_group_info: cannot resolve domain %s\n",
grp->nt_domain));
return False;
}
else
{
return make_mydomain_sid(grp, type);
}
return make_mydomain_sid(grp, type);
}
static BOOL make_name_entry(name_map_entry **new_ep,
@ -301,8 +294,6 @@ static void load_name_map(GROUP_TYPE type)
map_list = &aliasname_map_list;
}
DEBUG(10,("load_name_map : %s\n", map_file));
if (!(*initialised))
{
ubi_slInitList(map_list);