wkssvc.c

来自「samba最新软件」· C语言 代码 · 共 1,453 行 · 第 1/3 页

C
1,453
字号
	r.in.server_name = dcerpc_server_name(p);	r.in.message_name = dcerpc_server_name(p);	r.in.message_sender_name = dcerpc_server_name(p);	r.in.message_buffer = msg;	r.in.message_size = size;	torture_comment(tctx, "testing NetrMessageBufferSend\n");	status = dcerpc_wkssvc_NetrMessageBufferSend(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status,				   "NetrMessageBufferSend failed");	torture_assert_werr_ok(tctx, r.out.result,			       "NetrMessageBufferSend failed");	return true;}static bool test_NetrGetJoinInformation(struct torture_context *tctx,					struct dcerpc_pipe *p){	NTSTATUS status;	struct wkssvc_NetrGetJoinInformation r;	enum wkssvc_NetJoinStatus join_status;	const char *name_buffer = "";	r.in.server_name = dcerpc_server_name(p);	r.in.name_buffer = r.out.name_buffer = &name_buffer;	r.out.name_type = &join_status;	torture_comment(tctx, "testing NetrGetJoinInformation\n");	status = dcerpc_wkssvc_NetrGetJoinInformation(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status,				   "NetrGetJoinInformation failed");	torture_assert_werr_ok(tctx, r.out.result,			       "NetrGetJoinInformation failed");	return true;}static bool test_GetJoinInformation(struct torture_context *tctx,				    struct dcerpc_pipe *p,				    enum wkssvc_NetJoinStatus *join_status_p,				    const char **name){	NTSTATUS status;	struct wkssvc_NetrGetJoinInformation r;	enum wkssvc_NetJoinStatus join_status;	const char *name_buffer = "";	r.in.server_name = dcerpc_server_name(p);	r.in.name_buffer = r.out.name_buffer = &name_buffer;	r.out.name_type = &join_status;	status = dcerpc_wkssvc_NetrGetJoinInformation(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status,				   "NetrGetJoinInformation failed");	torture_assert_werr_ok(tctx, r.out.result,			       "NetrGetJoinInformation failed");	if (join_status_p) {		*join_status_p = join_status;	}	if (*name) {		*name = talloc_strdup(tctx, name_buffer);	}	return true;}static bool test_NetrGetJoinableOus(struct torture_context *tctx,				    struct dcerpc_pipe *p){	NTSTATUS status;	struct wkssvc_NetrGetJoinableOus r;	uint32_t num_ous = 0;	const char **ous = NULL;	r.in.server_name = dcerpc_server_name(p);	r.in.domain_name = lp_workgroup(tctx->lp_ctx);	r.in.Account = NULL;	r.in.unknown = NULL;	r.in.num_ous = r.out.num_ous = &num_ous;	r.out.ous = &ous;	torture_comment(tctx, "testing NetrGetJoinableOus\n");	status = dcerpc_wkssvc_NetrGetJoinableOus(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status, "NetrGetJoinableOus failed");	torture_assert_werr_equal(tctx, r.out.result,				  WERR_NOT_SUPPORTED,				  "NetrGetJoinableOus failed");	return true;}static bool test_NetrGetJoinableOus2(struct torture_context *tctx,				     struct dcerpc_pipe *p){	NTSTATUS status;	struct wkssvc_NetrGetJoinableOus2 r;	uint32_t num_ous = 0;	const char **ous = NULL;	r.in.server_name = dcerpc_server_name(p);	r.in.domain_name = lp_workgroup(tctx->lp_ctx);	r.in.Account = NULL;	r.in.EncryptedPassword = NULL;	r.in.num_ous = r.out.num_ous = &num_ous;	r.out.ous = &ous;	torture_comment(tctx, "testing NetrGetJoinableOus2\n");	status = dcerpc_wkssvc_NetrGetJoinableOus2(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status, "NetrGetJoinableOus2 failed");	torture_assert_werr_equal(tctx, r.out.result,				  WERR_RPC_E_REMOTE_DISABLED,				  "NetrGetJoinableOus2 failed");	return true;}static bool test_NetrUnjoinDomain(struct torture_context *tctx,				  struct dcerpc_pipe *p){	NTSTATUS status;	struct wkssvc_NetrUnjoinDomain r;	struct cli_credentials *creds = cmdline_credentials;	const char *user = cli_credentials_get_username(creds);	const char *admin_account = NULL;	admin_account = talloc_asprintf(tctx, "%s\\%s",					lp_workgroup(tctx->lp_ctx),					user);	r.in.server_name = dcerpc_server_name(p);	r.in.Account = admin_account;	r.in.password = NULL;	r.in.unjoin_flags = 0;	torture_comment(tctx, "testing NetrUnjoinDomain\n");	status = dcerpc_wkssvc_NetrUnjoinDomain(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status,				   "NetrUnjoinDomain failed");	torture_assert_werr_equal(tctx, r.out.result, WERR_NOT_SUPPORTED,				  "NetrUnjoinDomain failed");	return true;}static bool test_NetrJoinDomain(struct torture_context *tctx,				struct dcerpc_pipe *p){	NTSTATUS status;	struct wkssvc_NetrJoinDomain r;	struct cli_credentials *creds = cmdline_credentials;	const char *user = cli_credentials_get_username(creds);	const char *admin_account = NULL;	admin_account = talloc_asprintf(tctx, "%s\\%s",					lp_workgroup(tctx->lp_ctx),					user);	r.in.server_name = dcerpc_server_name(p);	r.in.domain_name = lp_realm(tctx->lp_ctx);	r.in.account_ou = NULL;	r.in.Account = admin_account;	r.in.password = NULL;	r.in.join_flags = 0;	torture_comment(tctx, "testing NetrJoinDomain\n");	status = dcerpc_wkssvc_NetrJoinDomain(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status,				   "NetrJoinDomain failed");	torture_assert_werr_equal(tctx, r.out.result, WERR_NOT_SUPPORTED,				  "NetrJoinDomain failed");	return true;}/* encode a wkssvc_PasswordBuffer for remote joining/unjoining: * * similar to samr_CryptPasswordEx. Different: 8byte confounder (instead of * 16byte), confounder in front of the 516 byte buffer (instead of after that * buffer), calling MD5Update() first with session_key and then with confounder * (vice versa in samr) - Guenther */static void encode_wkssvc_join_password_buffer(TALLOC_CTX *mem_ctx,					       const char *pwd,					       DATA_BLOB *session_key,					       struct wkssvc_PasswordBuffer *pwd_buf){	uint8_t buffer[516];	struct MD5Context ctx;	DATA_BLOB confounded_session_key = data_blob_talloc(mem_ctx, NULL, 16);	int confounder_len = 8;	uint8_t confounder[8];	encode_pw_buffer(buffer, pwd, STR_UNICODE);	generate_random_buffer((uint8_t *)confounder, confounder_len);	MD5Init(&ctx);	MD5Update(&ctx, session_key->data, session_key->length);	MD5Update(&ctx, confounder, confounder_len);	MD5Final(confounded_session_key.data, &ctx);	arcfour_crypt_blob(buffer, 516, &confounded_session_key);	memcpy(&pwd_buf->data[0], confounder, confounder_len);	memcpy(&pwd_buf->data[8], buffer, 516);	data_blob_free(&confounded_session_key);}/* * prerequisites for remotely joining an unjoined XP SP2 workstation: * - firewall needs to be disabled (or open for ncacn_np access) * - HKLM\System\CurrentControlSet\Control\Lsa\forceguest needs to 0 * see also: * http://support.microsoft.com/kb/294355/EN-US/ and * http://support.microsoft.com/kb/290403/EN-US/ */static bool test_NetrJoinDomain2(struct torture_context *tctx,				 struct dcerpc_pipe *p){	NTSTATUS status;	struct wkssvc_NetrJoinDomain2 r;	const char *domain_admin_account = NULL;	const char *domain_admin_password = NULL;	const char *domain_name = NULL;	struct wkssvc_PasswordBuffer pwd_buf;	enum wkssvc_NetJoinStatus join_status;	const char *join_name = NULL;	WERROR expected_err;	DATA_BLOB session_key;	/* FIXME: this test assumes to join workstations / servers and does not	 * handle DCs (WERR_SETUP_DOMAIN_CONTROLLER) */	if (!test_GetJoinInformation(tctx, p, &join_status, &join_name))	{		return false;	}	switch (join_status) {		case NetSetupDomainName:			expected_err = WERR_SETUP_ALREADY_JOINED;			break;		case NetSetupUnknownStatus:		case NetSetupUnjoined:		case NetSetupWorkgroupName:		default:			expected_err = WERR_OK;			break;	}	domain_admin_account = torture_setting_string(tctx, "domain_admin_account", NULL);	domain_admin_password = torture_setting_string(tctx, "domain_admin_password", NULL);	domain_name = torture_setting_string(tctx, "domain_name", NULL);	if ((domain_admin_account == NULL) ||	    (domain_admin_password == NULL) ||	    (domain_name == NULL)) {		torture_comment(tctx, "not enough input parameter\n");	    	return false;	}	status = dcerpc_fetch_session_key(p, &session_key);	if (!NT_STATUS_IS_OK(status)) {		return false;	}	encode_wkssvc_join_password_buffer(tctx, domain_admin_password,					   &session_key, &pwd_buf);	r.in.server_name = dcerpc_server_name(p);	r.in.domain_name = domain_name;	r.in.account_ou = NULL;	r.in.admin_account = domain_admin_account;	r.in.encrypted_password = &pwd_buf;	r.in.join_flags = WKSSVC_JOIN_FLAGS_JOIN_TYPE |			  WKSSVC_JOIN_FLAGS_ACCOUNT_CREATE;	torture_comment(tctx, "testing NetrJoinDomain2 (assuming non-DC)\n");	status = dcerpc_wkssvc_NetrJoinDomain2(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status,				   "NetrJoinDomain2 failed");	torture_assert_werr_equal(tctx, r.out.result, expected_err,				  "NetrJoinDomain2 failed");	if (!test_GetJoinInformation(tctx, p, &join_status, &join_name))	{		return false;	}	if (join_status != NetSetupDomainName) {		torture_comment(tctx,				"Join verify failed: got %d\n", join_status);		return false;	}	return true;}static bool test_NetrUnjoinDomain2(struct torture_context *tctx,				   struct dcerpc_pipe *p){	NTSTATUS status;	struct wkssvc_NetrUnjoinDomain2 r;	const char *domain_admin_account = NULL;	const char *domain_admin_password = NULL;	struct wkssvc_PasswordBuffer pwd_buf;	enum wkssvc_NetJoinStatus join_status;	const char *join_name = NULL;	WERROR expected_err;	DATA_BLOB session_key;	/* FIXME: this test assumes to join workstations / servers and does not	 * handle DCs (WERR_SETUP_DOMAIN_CONTROLLER) */	if (!test_GetJoinInformation(tctx, p, &join_status, &join_name))	{		return false;	}	switch (join_status) {		case NetSetupUnjoined:			expected_err = WERR_SETUP_NOT_JOINED;			break;		case NetSetupDomainName:		case NetSetupUnknownStatus:		case NetSetupWorkgroupName:		default:			expected_err = WERR_OK;			break;	}	domain_admin_account = torture_setting_string(tctx, "domain_admin_account", NULL);	domain_admin_password = torture_setting_string(tctx, "domain_admin_password", NULL);	if ((domain_admin_account == NULL) ||	    (domain_admin_password == NULL)) {		torture_comment(tctx, "not enough input parameter\n");	    	return false;	}	status = dcerpc_fetch_session_key(p, &session_key);	if (!NT_STATUS_IS_OK(status)) {		return false;	}	encode_wkssvc_join_password_buffer(tctx, domain_admin_password,					   &session_key, &pwd_buf);	r.in.server_name = dcerpc_server_name(p);	r.in.account = domain_admin_account;	r.in.encrypted_password = &pwd_buf;	r.in.unjoin_flags = 0;	torture_comment(tctx, "testing NetrUnjoinDomain2 (assuming non-DC)\n");	status = dcerpc_wkssvc_NetrUnjoinDomain2(p, tctx, &r);	torture_assert_ntstatus_ok(tctx, status,				   "NetrUnjoinDomain2 failed");	torture_assert_werr_equal(tctx, r.out.result, expected_err,				  "NetrUnjoinDomain2 failed");	if (!test_GetJoinInformation(tctx, p, &join_status, &join_name))	{		return false;	}	switch (join_status) {		case NetSetupUnjoined:		case NetSetupWorkgroupName:			break;		case NetSetupUnknown:		case NetSetupDomainName:		default:			torture_comment(tctx,				"Unjoin verify failed: got %d\n", join_status);			return false;	}	return true;}struct torture_suite *torture_rpc_wkssvc(TALLOC_CTX *mem_ctx){	struct torture_suite *suite;	struct torture_rpc_tcase *tcase;	struct torture_test *test;	suite = torture_suite_create(mem_ctx, "WKSSVC");	tcase = torture_suite_add_rpc_iface_tcase(suite, "wkssvc",						  &ndr_table_wkssvc);	torture_rpc_tcase_add_test(tcase, "NetWkstaGetInfo",				   test_NetWkstaGetInfo);	torture_rpc_tcase_add_test(tcase, "NetWkstaTransportEnum",				   test_NetWkstaTransportEnum);	torture_rpc_tcase_add_test(tcase, "NetrWkstaTransportDel",				   test_NetrWkstaTransportDel);	torture_rpc_tcase_add_test(tcase, "NetrWkstaTransportAdd",				   test_NetrWkstaTransportAdd);	torture_rpc_tcase_add_test(tcase, "NetWkstaEnumUsers",				   test_NetWkstaEnumUsers);	torture_rpc_tcase_add_test(tcase, "NetrWkstaUserGetInfo",				   test_NetrWkstaUserGetInfo);	torture_rpc_tcase_add_test(tcase, "NetrUseDel",				   test_NetrUseDel);	torture_rpc_tcase_add_test(tcase, "NetrUseGetInfo",				   test_NetrUseGetInfo);	torture_rpc_tcase_add_test(tcase, "NetrUseEnum",				   test_NetrUseEnum);	torture_rpc_tcase_add_test(tcase, "NetrUseAdd",				   test_NetrUseAdd);	torture_rpc_tcase_add_test(tcase, "NetrValidateName",				   test_NetrValidateName);	torture_rpc_tcase_add_test(tcase, "NetrValidateName2",				   test_NetrValidateName2);	torture_rpc_tcase_add_test(tcase, "NetrLogonDomainNameDel",				   test_NetrLogonDomainNameDel);	torture_rpc_tcase_add_test(tcase, "NetrLogonDomainNameAdd",				   test_NetrLogonDomainNameAdd);	torture_rpc_tcase_add_test(tcase, "NetrRemoveAlternateComputerName",				   test_NetrRemoveAlternateComputerName);	torture_rpc_tcase_add_test(tcase, "NetrAddAlternateComputerName",				   test_NetrAddAlternateComputerName);	test = torture_rpc_tcase_add_test(tcase, "NetrSetPrimaryComputername",					  test_NetrSetPrimaryComputername);	test->dangerous = true;	test = torture_rpc_tcase_add_test(tcase, "NetrRenameMachineInDomain",					  test_NetrRenameMachineInDomain);	test->dangerous = true;	test = torture_rpc_tcase_add_test(tcase, "NetrRenameMachineInDomain2",					  test_NetrRenameMachineInDomain2);	test->dangerous = true;	torture_rpc_tcase_add_test(tcase, "NetrEnumerateComputerNames",				   test_NetrEnumerateComputerNames);	test = torture_rpc_tcase_add_test(tcase, "NetrJoinDomain2",					  test_NetrJoinDomain2);	test->dangerous = true;	test = torture_rpc_tcase_add_test(tcase, "NetrUnjoinDomain2",					  test_NetrUnjoinDomain2);	test->dangerous = true;	torture_rpc_tcase_add_test(tcase, "NetrJoinDomain",				   test_NetrJoinDomain);	test->dangerous = true;	torture_rpc_tcase_add_test(tcase, "NetrUnjoinDomain",				   test_NetrUnjoinDomain);	test->dangerous = true;	torture_rpc_tcase_add_test(tcase, "NetrGetJoinInformation",				   test_NetrGetJoinInformation);	torture_rpc_tcase_add_test(tcase, "NetrGetJoinableOus",				   test_NetrGetJoinableOus);	torture_rpc_tcase_add_test(tcase, "NetrGetJoinableOus2",				   test_NetrGetJoinableOus2);	torture_rpc_tcase_add_test(tcase, "NetrWorkstationStatisticsGet",				   test_NetrWorkstationStatisticsGet);	torture_rpc_tcase_add_test(tcase, "NetrMessageBufferSend",				   test_NetrMessageBufferSend);	return suite;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?