[Fwd: [Fwd: Re: [samba] samba DC + MS SMS]]

Дейтер Александр Ва Дейтер Александр Ва
Сб Янв 14 11:46:53 MSK 2006


Добрый день!

В продолжение темы:

> и добавилась ошибка NT_STATUS_INVALID_INFO_CLASS при вызове
> rpc_server/srv_samr_nt.c:_samr_query_userinfo для пользователя smssrv:
> 
> [2006/01/14 00:02:41, 5] rpc_server/srv_samr_nt.c:_samr_query_userinfo(1870)
>   _samr_query_userinfo: sid:S-1-5-21-493673666-3865861243-703312239-4992
> [2006/01/14 00:02:41, 5] rpc_parse/parse_prs.c:prs_debug(84)
>   000000 samr_io_r_query_userinfo
> [2006/01/14 00:02:41, 5] rpc_parse/parse_prs.c:prs_uint32(703)
>       0000 ptr: 00000000
> [2006/01/14 00:02:41, 5] rpc_parse/parse_prs.c:prs_ntstatus(733)
>       0004 status: NT_STATUS_INVALID_INFO_CLASS
> 
> Эта ошибка от того, что в rpc_server/srv_samr_nt.c:_samr_query_userinfo
> 
> q_u->switch_value равно 9. а в switch (q_u->switch_value) {
> такого значения не обрабатывается.
> 
> В samba-tng есть get_user_info_9:
> Т.е. если я правильно понял, необходимо реализовать аналогичные
> get_user_info_9/make_sam_user_info9 в samba3 ?

С оглядкой на samba-tng я дописал необходимый код для samba3 и MS SMS
2003 успешно установился на Windows 2000 и Windows 2003 на стенде в
домене samba 3.0.21a на FreeBSD 5.3 sparc64. Патч в атаче.

Александр посмотрите его пожалуйста.

Большое спасибо!

-- 
С уважением,
Дейтер Александр Валериевич
Ведущий специалист
Отдел технического администрирования, Блок по эксплуатации ИТ
Филиал ОАО "МТС" в г.Сыктывкар, Республика Коми
тел. 88021, 8212 206 321
факс 88494, 8212 206 494
моб. 912 867 29 44
----------- следущая часть -----------
diff -ur samba-3.0.21a/source/include/rpc_samr.h samba-3.0.21a-sms/source/include/rpc_samr.h
--- samba-3.0.21a/source/include/rpc_samr.h	Fri Dec  2 22:21:49 2005
+++ samba-3.0.21a-sms/source/include/rpc_samr.h	Sat Jan 14 11:05:52 2006
@@ -408,6 +408,14 @@
 
 } SAM_USER_INFO_16;
 
+
+/* SAM_USER_INFO_9 */
+typedef struct sam_user_info_9
+{
+	uint32 rid_group;     /* Primary Group RID */
+} SAM_USER_INFO_9;
+
+
 /* SAM_USER_INFO_7 */
 typedef struct sam_user_info_7
 {
@@ -1255,6 +1263,7 @@
 	union
 	{
 		SAM_USER_INFO_7  *id7;
+		SAM_USER_INFO_9  *id9;
 		SAM_USER_INFO_16 *id16;
 		SAM_USER_INFO_17 *id17;
 		SAM_USER_INFO_18 *id18;
diff -ur samba-3.0.21a/source/rpc_parse/parse_samr.c samba-3.0.21a-sms/source/rpc_parse/parse_samr.c
--- samba-3.0.21a/source/rpc_parse/parse_samr.c	Fri Dec  2 22:21:49 2005
+++ samba-3.0.21a-sms/source/rpc_parse/parse_samr.c	Sat Jan 14 11:25:48 2006
@@ -5183,6 +5183,39 @@
 }
 
 /*******************************************************************
+inits a SAM_USER_INFO_9 structure.
+********************************************************************/
+
+void init_sam_user_info9(SAM_USER_INFO_9 * usr, uint32 rid_group)
+{
+	DEBUG(5, ("init_sam_user_info9\n"));
+
+	usr->rid_group = rid_group;
+}
+
+/*******************************************************************
+reads or writes a structure.
+********************************************************************/
+
+static BOOL sam_io_user_info9(const char *desc, SAM_USER_INFO_9 * usr,
+			prs_struct *ps, int depth)
+{
+	if (usr == NULL)
+		return False;
+
+	prs_debug(ps, depth, desc, "samr_io_r_user_info9");
+	depth++;
+
+	if(!prs_align(ps))
+		return False;
+
+	if(!prs_uint32("rid_group", ps, depth, &usr->rid_group))
+		return False;
+
+	return True;
+}
+
+/*******************************************************************
 inits a SAM_USER_INFO_16 structure.
 ********************************************************************/
 
@@ -6353,6 +6386,15 @@
 			return False;
 		}
 		ret = sam_io_user_info7("", ctr->info.id7, ps, depth);
+		break;
+	case 9:
+		if (UNMARSHALLING(ps))
+			ctr->info.id9 = PRS_ALLOC_MEM(ps,SAM_USER_INFO_9,1);
+		if (ctr->info.id9 == NULL) {
+			DEBUG(2,("samr_io_userinfo_ctr: info pointer not initialised\n"));
+			return False;
+		}
+		ret = sam_io_user_info9("", ctr->info.id9, ps, depth);
 		break;
 	case 16:
 		if (UNMARSHALLING(ps))
diff -ur samba-3.0.21a/source/rpc_server/srv_samr_nt.c samba-3.0.21a-sms/source/rpc_server/srv_samr_nt.c
--- samba-3.0.21a/source/rpc_server/srv_samr_nt.c	Tue Dec 20 18:28:39 2005
+++ samba-3.0.21a-sms/source/rpc_server/srv_samr_nt.c	Sat Jan 14 11:40:36 2006
@@ -1686,6 +1686,41 @@
 
 	return NT_STATUS_OK;
 }
+
+/*************************************************************************
+ get_user_info_9. Only gives out primary group SID.
+ *************************************************************************/
+static NTSTATUS get_user_info_9(TALLOC_CTX *mem_ctx, SAM_USER_INFO_9 * id9, DOM_SID *user_sid)
+{
+	SAM_ACCOUNT *smbpass=NULL;
+	BOOL ret;
+	NTSTATUS nt_status;
+
+	nt_status = pdb_init_sam_talloc(mem_ctx, &smbpass);
+
+	if (!NT_STATUS_IS_OK(nt_status)) {
+		return nt_status;
+	}
+
+	become_root();
+	ret = pdb_getsampwsid(smbpass, user_sid);
+	unbecome_root();
+
+	if (ret==False) {
+		DEBUG(4,("User %s not found\n", sid_string_static(user_sid)));
+		return NT_STATUS_NO_SUCH_USER;
+	}
+
+	DEBUG(3,("User:[%s]\n", pdb_get_username(smbpass) ));
+
+	ZERO_STRUCTP(id9);
+	init_sam_user_info9(id9, pdb_get_group_rid(smbpass) );
+
+	pdb_free_sam(&smbpass);
+
+	return NT_STATUS_OK;
+}
+
 /*************************************************************************
  get_user_info_16. Safe. Only gives out acb bits.
  *************************************************************************/
@@ -1878,6 +1913,8 @@
 	/* ok!  user info levels (lots: see MSDEV help), off we go... */
 	ctr->switch_value = q_u->switch_value;
 
+	DEBUG(5,("_samr_query_userinfo: user info level: %d\n", q_u->switch_value));
+
 	switch (q_u->switch_value) {
 	case 7:
 		ctr->info.id7 = TALLOC_ZERO_P(p->mem_ctx, SAM_USER_INFO_7);
@@ -1887,6 +1924,14 @@
 		if (!NT_STATUS_IS_OK(r_u->status = get_user_info_7(p->mem_ctx, ctr->info.id7, &info->sid)))
 			return r_u->status;
 		break;
+	case 9:
+		ctr->info.id9 = TALLOC_ZERO_P(p->mem_ctx, SAM_USER_INFO_9);
+		if (ctr->info.id9 == NULL)
+			return NT_STATUS_NO_MEMORY;
+
+		if (!NT_STATUS_IS_OK(r_u->status = get_user_info_9(p->mem_ctx, ctr->info.id9, &info->sid)))
+			return r_u->status;
+		break;
 	case 16:
 		ctr->info.id16 = TALLOC_ZERO_P(p->mem_ctx, SAM_USER_INFO_16);
 		if (ctr->info.id16 == NULL)
@@ -2603,8 +2648,12 @@
 
 	ZERO_STRUCT(sid);
 
-	if (!secrets_fetch_domain_sid(domain_name, &sid)) {
-		r_u->status = NT_STATUS_NO_SUCH_DOMAIN;
+	if (strequal(domain_name, "BUILTIN")) {
+		sid_copy(&sid, &global_sid_Builtin);
+	} else {
+		if (!secrets_fetch_domain_sid(domain_name, &sid)) {
+			r_u->status = NT_STATUS_NO_SUCH_DOMAIN;
+		}
 	}
 
 	DEBUG(2,("Returning domain sid for domain %s -> %s\n", domain_name, sid_string_static(&sid)));


Подробная информация о списке рассылки Samba