summaryrefslogtreecommitdiff
path: root/source4/rpc_server/samr/dcesrv_samr.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/rpc_server/samr/dcesrv_samr.c')
-rw-r--r--source4/rpc_server/samr/dcesrv_samr.c224
1 files changed, 210 insertions, 14 deletions
diff --git a/source4/rpc_server/samr/dcesrv_samr.c b/source4/rpc_server/samr/dcesrv_samr.c
index 9de81c33e5..a4e5d4f189 100644
--- a/source4/rpc_server/samr/dcesrv_samr.c
+++ b/source4/rpc_server/samr/dcesrv_samr.c
@@ -1100,6 +1100,17 @@ static NTSTATUS samr_DeleteUser(struct dcesrv_call_state *dce_call, TALLOC_CTX *
r->out.info->field = samdb_result_rid_from_sid(mem_ctx, msg, attr, 0);
#define QUERY_NTTIME(msg, field, attr) \
r->out.info->field = samdb_result_nttime(msg, attr, 0);
+#define QUERY_APASSC(msg, field, attr) \
+ r->out.info->field = samdb_result_allow_pwd_change(state->sam_ctx, mem_ctx, \
+ state->domain_state->basedn, msg, attr);
+#define QUERY_FPASSC(msg, field, attr) \
+ r->out.info->field = samdb_result_force_pwd_change(state->sam_ctx, mem_ctx, \
+ state->domain_state->basedn, msg, attr);
+#define QUERY_LHOURS(msg, field, attr) \
+ r->out.info->field = samdb_result_logon_hours(mem_ctx, msg, attr);
+#define QUERY_AFLAGS(msg, field, attr) \
+ r->out.info->field = samdb_result_acct_flags(msg, attr);
+
/*
samr_QueryUserInfo
@@ -1152,7 +1163,7 @@ static NTSTATUS samr_QueryUserInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
case 3:
QUERY_STRING(msg, info3.username.name, "sAMAccountName");
QUERY_STRING(msg, info3.full_name.name, "displayName");
- QUERY_RID (msg, info3.Rid, "objectSid");
+ QUERY_RID (msg, info3.rid, "objectSid");
QUERY_UINT (msg, info3.primary_gid, "primaryGroupID");
QUERY_STRING(msg, info3.home_directory.name, "homeDirectory");
QUERY_STRING(msg, info3.home_drive.name, "homeDrive");
@@ -1162,15 +1173,117 @@ static NTSTATUS samr_QueryUserInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
QUERY_NTTIME(msg, info3.last_logon, "lastLogon");
QUERY_NTTIME(msg, info3.last_logoff, "lastLogoff");
QUERY_NTTIME(msg, info3.last_pwd_change, "pwdLastSet");
-/*
- QUERY_APASSC(msg, info2.allow_pwd_change, "pwdLastSet");
- QUERY_LHOURS(msg, info2.logon_hours, "logonHours");
- QUERY_UINT (msg, info2.bad_pwd_count, "badPwdCount");
- QUERY_UINT (msg, info2.num_logons, "logonCount");
- QUERY_AFLAGS(msg, info2.acct_flags, "userAccountControl");
-*/
+ QUERY_APASSC(msg, info3.allow_pwd_change, "pwdLastSet");
+ QUERY_FPASSC(msg, info3.force_pwd_change, "pwdLastSet");
+ QUERY_LHOURS(msg, info3.logon_hours, "logonHours");
+ QUERY_UINT (msg, info3.bad_pwd_count, "badPwdCount");
+ QUERY_UINT (msg, info3.num_logons, "logonCount");
+ QUERY_AFLAGS(msg, info3.acct_flags, "userAccountControl");
+ break;
+
+ case 4:
+ QUERY_LHOURS(msg, info4.logon_hours, "logonHours");
+ break;
+
+ case 5:
+ QUERY_STRING(msg, info5.username.name, "sAMAccountName");
+ QUERY_STRING(msg, info5.full_name.name, "displayName");
+ QUERY_RID (msg, info5.rid, "objectSid");
+ QUERY_UINT (msg, info5.primary_gid, "primaryGroupID");
+ QUERY_STRING(msg, info5.home_directory.name, "homeDirectory");
+ QUERY_STRING(msg, info5.home_drive.name, "homeDrive");
+ QUERY_STRING(msg, info5.logon_script.name, "scriptPath");
+ QUERY_STRING(msg, info5.profile.name, "profilePath");
+ QUERY_STRING(msg, info5.description.name, "description");
+ QUERY_STRING(msg, info5.workstations.name, "userWorkstations");
+ QUERY_NTTIME(msg, info5.last_logon, "lastLogon");
+ QUERY_NTTIME(msg, info5.last_logoff, "lastLogoff");
+ QUERY_LHOURS(msg, info5.logon_hours, "logonHours");
+ QUERY_UINT (msg, info5.bad_pwd_count, "badPwdCount");
+ QUERY_UINT (msg, info5.num_logons, "logonCount");
+ QUERY_NTTIME(msg, info5.last_pwd_change, "pwdLastSet");
+ QUERY_NTTIME(msg, info5.acct_expiry, "accountExpires");
+ QUERY_AFLAGS(msg, info5.acct_flags, "userAccountControl");
+ break;
+
+ case 6:
+ QUERY_STRING(msg, info6.username.name, "sAMAccountName");
+ QUERY_STRING(msg, info6.full_name.name, "displayName");
+ break;
+
+ case 7:
+ QUERY_STRING(msg, info7.username.name, "sAMAccountName");
+ break;
+
+ case 8:
+ QUERY_STRING(msg, info8.full_name.name, "displayName");
+ break;
+
+ case 9:
+ QUERY_UINT (msg, info9.primary_gid, "primaryGroupID");
+ break;
+
+ case 10:
+ QUERY_STRING(msg, info10.home_directory.name, "homeDirectory");
+ QUERY_STRING(msg, info10.home_drive.name, "homeDrive");
+ break;
+
+ case 11:
+ QUERY_STRING(msg, info11.logon_script.name, "scriptPath");
break;
+ case 12:
+ QUERY_STRING(msg, info12.profile.name, "profilePath");
+ break;
+
+ case 13:
+ QUERY_STRING(msg, info13.description.name, "description");
+ break;
+
+ case 14:
+ QUERY_STRING(msg, info14.workstations.name, "userWorkstations");
+ break;
+
+ case 16:
+ QUERY_AFLAGS(msg, info16.acct_flags, "userAccountControl");
+ break;
+
+ case 17:
+ QUERY_NTTIME(msg, info17.acct_expiry, "accountExpires");
+
+ case 20:
+ QUERY_STRING(msg, info20.callback.name, "userParameters");
+ break;
+
+ case 21:
+ QUERY_NTTIME(msg, info21.last_logon, "lastLogon");
+ QUERY_NTTIME(msg, info21.last_logoff, "lastLogoff");
+ QUERY_NTTIME(msg, info21.last_pwd_change, "pwdLastSet");
+ QUERY_NTTIME(msg, info21.acct_expiry, "accountExpires");
+ QUERY_APASSC(msg, info21.allow_pwd_change, "pwdLastSet");
+ QUERY_FPASSC(msg, info21.force_pwd_change, "pwdLastSet");
+ QUERY_STRING(msg, info21.username.name, "sAMAccountName");
+ QUERY_STRING(msg, info21.full_name.name, "displayName");
+ QUERY_STRING(msg, info21.home_directory.name, "homeDirectory");
+ QUERY_STRING(msg, info21.home_drive.name, "homeDrive");
+ QUERY_STRING(msg, info21.logon_script.name, "scriptPath");
+ QUERY_STRING(msg, info21.profile.name, "profilePath");
+ QUERY_STRING(msg, info21.description.name, "description");
+ QUERY_STRING(msg, info21.workstations.name, "userWorkstations");
+ QUERY_STRING(msg, info21.comment.name, "comment");
+ QUERY_STRING(msg, info21.callback.name, "userParameters");
+ QUERY_RID (msg, info21.rid, "objectSid");
+ QUERY_UINT (msg, info21.primary_gid, "primaryGroupID");
+ QUERY_AFLAGS(msg, info21.acct_flags, "userAccountControl");
+ r->out.info->info21.fields_present = 0x00FFFFFF;
+ QUERY_LHOURS(msg, info21.logon_hours, "logonHours");
+ QUERY_UINT (msg, info21.bad_pwd_count, "badPwdCount");
+ QUERY_UINT (msg, info21.num_logons, "logonCount");
+ QUERY_UINT (msg, info21.country_code, "countryCode");
+ QUERY_UINT (msg, info21.code_page, "codePage");
+ break;
+
+
default:
r->out.info = NULL;
return NT_STATUS_INVALID_INFO_CLASS;
@@ -1179,6 +1292,7 @@ static NTSTATUS samr_QueryUserInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
return NT_STATUS_OK;
}
+
/* these are used to make the SetUserInfo code easier to follow */
#define SET_STRING(mod, field, attr) do { \
if (r->in.info->field == NULL) return NT_STATUS_INVALID_PARAMETER; \
@@ -1193,6 +1307,17 @@ static NTSTATUS samr_QueryUserInfo(struct dcesrv_call_state *dce_call, TALLOC_CT
} \
} while (0)
+#define SET_AFLAGS(msg, field, attr) do { \
+ if (samdb_msg_add_acct_flags(state->sam_ctx, mem_ctx, msg, attr, r->in.info->field) != 0) { \
+ return NT_STATUS_NO_MEMORY; \
+ } \
+} while (0)
+
+#define SET_LHOURS(msg, field, attr) do { \
+ if (samdb_msg_add_logon_hours(state->sam_ctx, mem_ctx, msg, attr, r->in.info->field) != 0) { \
+ return NT_STATUS_NO_MEMORY; \
+ } \
+} while (0)
/*
samr_SetUserInfo
@@ -1202,7 +1327,7 @@ static NTSTATUS samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX
{
struct dcesrv_handle *h;
struct samr_account_state *state;
- struct ldb_message mod;
+ struct ldb_message mod, *msg = &mod;
int i, ret;
DCESRV_PULL_HANDLE(h, r->in.handle, SAMR_HANDLE_USER);
@@ -1217,9 +1342,68 @@ static NTSTATUS samr_SetUserInfo(struct dcesrv_call_state *dce_call, TALLOC_CTX
switch (r->in.level) {
case 2:
- SET_STRING(&mod, info2.comment.name, "description");
- SET_UINT (&mod, info2.country_code, "countryCode");
- SET_UINT (&mod, info2.code_page, "codePage");
+ SET_STRING(msg, info2.comment.name, "comment");
+ SET_UINT (msg, info2.country_code, "countryCode");
+ SET_UINT (msg, info2.code_page, "codePage");
+ break;
+
+ case 4:
+ SET_LHOURS(msg, info4.logon_hours, "logonHours");
+ break;
+
+ case 6:
+ SET_STRING(msg, info6.full_name.name, "displayName");
+ break;
+
+ case 8:
+ SET_STRING(msg, info8.full_name.name, "displayName");
+ break;
+
+ case 9:
+ SET_UINT(msg, info9.primary_gid, "primaryGroupID");
+ break;
+
+ case 10:
+ SET_STRING(msg, info10.home_directory.name, "homeDirectory");
+ SET_STRING(msg, info10.home_drive.name, "homeDrive");
+ break;
+
+ case 11:
+ SET_STRING(msg, info11.logon_script.name, "scriptPath");
+ break;
+
+ case 12:
+ SET_STRING(msg, info12.profile.name, "profilePath");
+ break;
+
+ case 13:
+ SET_STRING(msg, info13.description.name, "description");
+ break;
+
+ case 14:
+ SET_STRING(msg, info14.workstations.name, "userWorkstations");
+ break;
+
+ case 16:
+ SET_AFLAGS(msg, info16.acct_flags, "userAccountControl");
+ break;
+
+ case 20:
+ SET_STRING(msg, info20.callback.name, "userParameters");
+ break;
+
+ case 21:
+#define IFSET(bit) if (bit & r->in.info->info21.fields_present)
+ IFSET(SAMR_FIELD_NAME) SET_STRING(msg, info21.full_name.name, "displayName");
+ IFSET(SAMR_FIELD_DESCRIPTION) SET_STRING(msg, info21.description.name, "description");
+ IFSET(SAMR_FIELD_COMMENT) SET_STRING(msg, info21.comment.name, "comment");
+ IFSET(SAMR_FIELD_LOGON_SCRIPT) SET_STRING(msg, info21.logon_script.name, "scriptPath");
+ IFSET(SAMR_FIELD_PROFILE) SET_STRING(msg, info21.profile.name, "profilePath");
+ IFSET(SAMR_FIELD_WORKSTATION) SET_STRING(msg, info21.workstations.name, "userWorkstations");
+ IFSET(SAMR_FIELD_LOGON_HOURS) SET_LHOURS(msg, info21.logon_hours, "logonHours");
+ IFSET(SAMR_FIELD_CALLBACK) SET_STRING(msg, info21.callback.name, "userParameters");
+ IFSET(SAMR_FIELD_COUNTRY_CODE) SET_UINT(msg, info21.country_code, "countryCode");
+ IFSET(SAMR_FIELD_CODE_PAGE) SET_UINT(msg, info21.code_page, "codePage");
break;
default:
@@ -1335,11 +1519,23 @@ static NTSTATUS samr_QueryDomainInfo2(struct dcesrv_call_state *dce_call, TALLOC
/*
samr_QueryUserInfo2
+
+ just an alias for samr_QueryUserInfo
*/
static NTSTATUS samr_QueryUserInfo2(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
- struct samr_QueryUserInfo2 *r)
+ struct samr_QueryUserInfo2 *r)
{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ struct samr_QueryUserInfo r1;
+ NTSTATUS status;
+
+ r1.in.handle = r->in.handle;
+ r1.in.level = r->in.level;
+
+ status = samr_QueryUserInfo(dce_call, mem_ctx, &r1);
+
+ r->out.info = r1.out.info;
+
+ return status;
}