⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_ads.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	status = ads_add_group_acct(ads, argv[0], opt_container, opt_comment);	if (ADS_ERR_OK(status)) {		d_printf("Group %s added\n", argv[0]);		rc = 0;	} else {		d_fprintf(stderr, "Could not add group %s: %s\n", argv[0],			 ads_errstr(status));	} done:	if (res)		ads_msgfree(ads, res);	ads_destroy(&ads);	return rc;}static int ads_group_delete(int argc, const char **argv){	ADS_STRUCT *ads;	ADS_STATUS rc;	void *res;	char *groupdn;	if (argc < 1) {		return net_ads_group_usage(argc, argv);	}		if (!(ads = ads_startup())) {		return -1;	}	rc = ads_find_user_acct(ads, &res, argv[0]);	if (!ADS_ERR_OK(rc)) {		DEBUG(0, ("Group %s does not exist\n", argv[0]));		ads_destroy(&ads);		return -1;	}	groupdn = ads_get_dn(ads, res);	ads_msgfree(ads, res);	rc = ads_del_dn(ads, groupdn);	ads_memfree(ads, groupdn);	if (!ADS_ERR_OK(rc)) {		d_printf("Group %s deleted\n", argv[0]);		ads_destroy(&ads);		return 0;	}	d_fprintf(stderr, "Error deleting group %s: %s\n", argv[0], 		 ads_errstr(rc));	ads_destroy(&ads);	return -1;}int net_ads_group(int argc, const char **argv){	struct functable func[] = {		{"ADD", ads_group_add},		{"DELETE", ads_group_delete},		{NULL, NULL}	};	ADS_STRUCT *ads;	ADS_STATUS rc;	const char *shortattrs[] = {"sAMAccountName", NULL};	const char *longattrs[] = {"sAMAccountName", "description", NULL};	char *disp_fields[2] = {NULL, NULL};	if (argc == 0) {		if (!(ads = ads_startup())) {			return -1;		}		if (opt_long_list_entries)			d_printf("\nGroup name            Comment"\				 "\n-----------------------------\n");		rc = ads_do_search_all_fn(ads, ads->config.bind_path, 					  LDAP_SCOPE_SUBTREE, 					  "(objectclass=group)", 					  opt_long_list_entries ? longattrs : 					  shortattrs, usergrp_display, 					  disp_fields);		ads_destroy(&ads);		return 0;	}	return net_run_function(argc, argv, func, net_ads_group_usage);}static int net_ads_status(int argc, const char **argv){	ADS_STRUCT *ads;	ADS_STATUS rc;	void *res;	if (!(ads = ads_startup())) {		return -1;	}	rc = ads_find_machine_acct(ads, &res, global_myname());	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "ads_find_machine_acct: %s\n", ads_errstr(rc));		ads_destroy(&ads);		return -1;	}	if (ads_count_replies(ads, res) == 0) {		d_fprintf(stderr, "No machine account for '%s' found\n", global_myname());		ads_destroy(&ads);		return -1;	}	ads_dump(ads, res);	ads_destroy(&ads);	return 0;}static int net_ads_leave(int argc, const char **argv){	ADS_STRUCT *ads = NULL;	ADS_STATUS rc;	if (!secrets_init()) {		DEBUG(1,("Failed to initialise secrets database\n"));		return -1;	}	if (!opt_password) {		net_use_machine_password();	}	if (!(ads = ads_startup())) {		return -1;	}	rc = ads_leave_realm(ads, global_myname());	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "Failed to delete host '%s' from the '%s' realm.\n", 			global_myname(), ads->config.realm);		ads_destroy(&ads);		return -1;	}	d_printf("Removed '%s' from realm '%s'\n", global_myname(), ads->config.realm);	ads_destroy(&ads);	return 0;}static int net_ads_join_ok(void){	ADS_STRUCT *ads = NULL;	if (!secrets_init()) {		DEBUG(1,("Failed to initialise secrets database\n"));		return -1;	}	net_use_machine_password();	if (!(ads = ads_startup())) {		return -1;	}	ads_destroy(&ads);	return 0;}/*  check that an existing join is OK */int net_ads_testjoin(int argc, const char **argv){	use_in_memory_ccache();	/* Display success or failure */	if (net_ads_join_ok() != 0) {		fprintf(stderr,"Join to domain is not valid\n");		return -1;	}	printf("Join is OK\n");	return 0;}/*  join a domain using ADS */int net_ads_join(int argc, const char **argv){	ADS_STRUCT *ads;	ADS_STATUS rc;	char *password;	char *machine_account = NULL;	char *tmp_password;	const char *org_unit = NULL;	char *dn;	void *res;	DOM_SID dom_sid;	char *ou_str;	uint32 sec_channel_type = SEC_CHAN_WKSTA;	uint32 account_type = UF_WORKSTATION_TRUST_ACCOUNT;	const char *short_domain_name = NULL;	TALLOC_CTX *ctx = NULL;	if (argc > 0) {		org_unit = argv[0];	}	if (!secrets_init()) {		DEBUG(1,("Failed to initialise secrets database\n"));		return -1;	}	tmp_password = generate_random_str(DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH);	password = SMB_STRDUP(tmp_password);	if (!(ads = ads_startup())) {		return -1;	}	if (!*lp_realm()) {		d_fprintf(stderr, "realm must be set in in smb.conf for ADS join to succeed.\n");		ads_destroy(&ads);		return -1;	}	if (strcmp(ads->config.realm, lp_realm()) != 0) {		d_fprintf(stderr, "realm of remote server (%s) and realm in smb.conf (%s) DO NOT match.  Aborting join\n", ads->config.realm, lp_realm());		ads_destroy(&ads);		return -1;	}	ou_str = ads_ou_string(ads,org_unit);	asprintf(&dn, "%s,%s", ou_str, ads->config.bind_path);	free(ou_str);	rc = ads_search_dn(ads, &res, dn, NULL);	ads_msgfree(ads, res);	if (rc.error_type == ENUM_ADS_ERROR_LDAP && rc.err.rc == LDAP_NO_SUCH_OBJECT) {		d_fprintf(stderr, "ads_join_realm: organizational unit %s does not exist (dn:%s)\n", 			 org_unit, dn);		ads_destroy(&ads);		return -1;	}	free(dn);	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "ads_join_realm: %s\n", ads_errstr(rc));		ads_destroy(&ads);		return -1;	}		rc = ads_join_realm(ads, global_myname(), account_type, org_unit);	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "ads_join_realm: %s\n", ads_errstr(rc));		ads_destroy(&ads);		return -1;	}	rc = ads_domain_sid(ads, &dom_sid);	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "ads_domain_sid: %s\n", ads_errstr(rc));			ads_destroy(&ads);		return -1;	}	if (asprintf(&machine_account, "%s$", global_myname()) == -1) {		d_fprintf(stderr, "asprintf failed\n");		ads_destroy(&ads);		return -1;	}	rc = ads_set_machine_password(ads, machine_account, password);	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "ads_set_machine_password: %s\n", ads_errstr(rc));		ads_destroy(&ads);		return -1;	}		/* make sure we get the right workgroup */		if ( !(ctx = talloc_init("net ads join")) ) {		d_fprintf(stderr, "talloc_init() failed!\n");		ads_destroy(&ads);		return -1;	}		rc = ads_workgroup_name(ads, ctx, &short_domain_name);	if ( ADS_ERR_OK(rc) ) {		if ( !strequal(lp_workgroup(), short_domain_name) ) {			d_printf("The workgroup in smb.conf does not match the short\n");			d_printf("domain name obtained from the server.\n");			d_printf("Using the name [%s] from the server.\n", short_domain_name);			d_printf("You should set \"workgroup = %s\" in smb.conf.\n", short_domain_name);		}	} else {		short_domain_name = lp_workgroup();	}		d_printf("Using short domain name -- %s\n", short_domain_name);		/*  HACK ALRET!  Store the sid and password under bother the lp_workgroup() 	    value from smb.conf and the string returned from the server.  The former is	    neede to bootstrap winbindd's first connection to the DC to get the real 	    short domain name   --jerry */	    	if (!secrets_store_domain_sid(lp_workgroup(), &dom_sid)) {		DEBUG(1,("Failed to save domain sid\n"));		ads_destroy(&ads);		return -1;	}	if (!secrets_store_machine_password(password, lp_workgroup(), sec_channel_type)) {		DEBUG(1,("Failed to save machine password\n"));		ads_destroy(&ads);		return -1;	}#ifdef HAVE_KRB5	if (!kerberos_derive_salting_principal(machine_account)) {		DEBUG(1,("Failed to determine salting principal\n"));		ads_destroy(&ads);		return -1;	}	if (!kerberos_derive_cifs_salting_principals()) {		DEBUG(1,("Failed to determine salting principals\n"));		ads_destroy(&ads);		return -1;	}#endif	if (!secrets_store_domain_sid(short_domain_name, &dom_sid)) {		DEBUG(1,("Failed to save domain sid\n"));		ads_destroy(&ads);		return -1;	}	if (!secrets_store_machine_password(password, short_domain_name, sec_channel_type)) {		DEBUG(1,("Failed to save machine password\n"));		ads_destroy(&ads);		return -1;	}		/* Now build the keytab, using the same ADS connection */	if (lp_use_kerberos_keytab() && ads_keytab_create_default(ads)) {		DEBUG(1,("Error creating host keytab!\n"));	}	d_printf("Joined '%s' to realm '%s'\n", global_myname(), ads->config.realm);	SAFE_FREE(password);	SAFE_FREE(machine_account);	if ( ctx ) {		talloc_destroy(ctx);	}	ads_destroy(&ads);	return 0;}int net_ads_printer_usage(int argc, const char **argv){	d_printf("\nnet ads printer search <printer>""\n\tsearch for a printer in the directory\n""\nnet ads printer info <printer> <server>""\n\tlookup info in directory for printer on server""\n\t(note: printer defaults to \"*\", server defaults to local)\n""\nnet ads printer publish <printername>""\n\tpublish printer in directory""\n\t(note: printer name is required)\n""\nnet ads printer remove <printername>""\n\tremove printer from directory""\n\t(note: printer name is required)\n");	return -1;}static int net_ads_printer_search(int argc, const char **argv){	ADS_STRUCT *ads;	ADS_STATUS rc;	void *res = NULL;	if (!(ads = ads_startup())) {		return -1;	}	rc = ads_find_printers(ads, &res);	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "ads_find_printer: %s\n", ads_errstr(rc));		ads_msgfree(ads, res);		ads_destroy(&ads);	 	return -1;	}	if (ads_count_replies(ads, res) == 0) {		d_fprintf(stderr, "No results found\n");		ads_msgfree(ads, res);		ads_destroy(&ads);		return -1;	}	ads_dump(ads, res);	ads_msgfree(ads, res);	ads_destroy(&ads);	return 0;}static int net_ads_printer_info(int argc, const char **argv){	ADS_STRUCT *ads;	ADS_STATUS rc;	const char *servername, *printername;	void *res = NULL;	if (!(ads = ads_startup())) {		return -1;	}	if (argc > 0) {		printername = argv[0];	} else {		printername = "*";	}	if (argc > 1) {		servername =  argv[1];	} else {		servername = global_myname();	}	rc = ads_find_printer_on_server(ads, &res, printername, servername);	if (!ADS_ERR_OK(rc)) {		d_fprintf(stderr, "ads_find_printer_on_server: %s\n", ads_errstr(rc));		ads_msgfree(ads, res);		ads_destroy(&ads);		return -1;	}	if (ads_count_replies(ads, res) == 0) {		d_fprintf(stderr, "Printer '%s' not found\n", printername);		ads_msgfree(ads, res);		ads_destroy(&ads);		return -1;	}	ads_dump(ads, res);	ads_msgfree(ads, res);	ads_destroy(&ads);	return 0;}void do_drv_upgrade_printer(int msg_type, struct process_id src,			    void *buf, size_t len){	return;}static int net_ads_printer_publish(int argc, const char **argv){        ADS_STRUCT *ads;        ADS_STATUS rc;	const char *servername, *printername;	struct cli_state *cli;	struct rpc_pipe_client *pipe_hnd;	struct in_addr 		server_ip;	NTSTATUS nt_status;	TALLOC_CTX *mem_ctx = talloc_init("net_ads_printer_publish");	ADS_MODLIST mods = ads_init_mods(mem_ctx);	char *prt_dn, *srv_dn, **srv_cn;	void *res = NULL;	if (!(ads = ads_startup())) {		return -1;	}	if (argc < 1) {		return net_ads_printer_usage(argc, argv);	}		printername = argv[0];	if (argc == 2) {		servername = argv[1];	} else {		servername = global_myname();	}			/* Get printer data from SPOOLSS */	resolve_name(servername, &server_ip, 0x20);	nt_status = cli_full_connection(&cli, global_myname(), servername, 					&server_ip, 0,					"IPC$", "IPC",  					opt_user_name, opt_workgroup,					opt_password ? opt_password : "", 					CLI_FULL_CONNECTION_USE_KERBEROS, 					Undefined, NULL);	if (NT_STATUS_IS_ERR(nt_status)) {		d_fprintf(stderr, "Unable to open a connnection to %s to obtain data "			 "for %s\n", servername, printername);		ads_destroy(&ads);		return -1;	}	/* Publish on AD server */	ads_find_machine_acct(ads, &res, servername);	if (ads_count_replies(ads, res) == 0) {		d_fprintf(stderr, "Could not find machine account for server %s\n", 			 servername);		ads_destroy(&ads);

⌨️ 快捷键说明

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