utils/net_ads.c

ソースコードを見る。

関数

int net_ads_usage (int argc, const char **argv)
static const char * assume_own_realm (void)
static int net_ads_cldap_netlogon (ADS_STRUCT *ads)
static int net_ads_lookup (int argc, const char **argv)
static int net_ads_info (int argc, const char **argv)
static void use_in_memory_ccache (void)
static ADS_STATUS ads_startup_int (BOOL only_own_domain, uint32 auth_flags, ADS_STRUCT **ads_ret)
ADS_STATUS ads_startup (BOOL only_own_domain, ADS_STRUCT **ads)
ADS_STATUS ads_startup_nobind (BOOL only_own_domain, ADS_STRUCT **ads)
static int net_ads_check_int (const char *realm, const char *workgroup, const char *host)
int net_ads_check_our_domain (void)
int net_ads_check (void)
static int net_ads_workgroup (int argc, const char **argv)
static BOOL usergrp_display (char *field, void **values, void *data_area)
static int net_ads_user_usage (int argc, const char **argv)
static int ads_user_add (int argc, const char **argv)
static int ads_user_info (int argc, const char **argv)
static int ads_user_delete (int argc, const char **argv)
int net_ads_user (int argc, const char **argv)
static int net_ads_group_usage (int argc, const char **argv)
static int ads_group_add (int argc, const char **argv)
static int ads_group_delete (int argc, const char **argv)
int net_ads_group (int argc, const char **argv)
static int net_ads_status (int argc, const char **argv)
static int net_ads_leave (int argc, const char **argv)
static NTSTATUS net_ads_join_ok (void)
int net_ads_testjoin (int argc, const char **argv)
static NTSTATUS check_ads_config (void)
static NTSTATUS net_join_domain (TALLOC_CTX *ctx, const char *servername, struct in_addr *ip, char **domain, DOM_SID **dom_sid, const char *password)
static ADS_STATUS net_set_machine_spn (TALLOC_CTX *ctx, ADS_STRUCT *ads_s)
static ADS_STATUS net_set_machine_upn (TALLOC_CTX *ctx, ADS_STRUCT *ads_s, const char *upn)
static ADS_STATUS net_set_os_attributes (TALLOC_CTX *ctx, ADS_STRUCT *ads_s, const char *os_name, const char *os_version)
static ADS_STATUS net_precreate_machine_acct (ADS_STRUCT *ads, const char *ou)
static BOOL net_derive_salting_principal (TALLOC_CTX *ctx, ADS_STRUCT *ads)
DNS_ERROR DoDNSUpdate (char *pszServerName, const char *pszDomainName, const char *pszHostName, const struct in_addr *iplist, int num_addrs)
static NTSTATUS net_update_dns_internal (TALLOC_CTX *ctx, ADS_STRUCT *ads, const char *machine_name, const struct in_addr *addrs, int num_addrs)
static NTSTATUS net_update_dns (TALLOC_CTX *mem_ctx, ADS_STRUCT *ads)
static char * get_string_param (const char *param)
static int net_ads_join_usage (int argc, const char **argv)
int net_ads_join (int argc, const char **argv)
static int net_ads_dns_usage (int argc, const char **argv)
static int net_ads_dns_register (int argc, const char **argv)
DNS_ERROR do_gethostbyname (const char *server, const char *host)
static int net_ads_dns_gethostbyname (int argc, const char **argv)
static int net_ads_dns (int argc, const char *argv[])
int net_ads_printer_usage (int argc, const char **argv)
static int net_ads_printer_search (int argc, const char **argv)
static int net_ads_printer_info (int argc, const char **argv)
void do_drv_upgrade_printer (int msg_type, struct process_id src, void *buf, size_t len, void *private_data)
static int net_ads_printer_publish (int argc, const char **argv)
static int net_ads_printer_remove (int argc, const char **argv)
static int net_ads_printer (int argc, const char **argv)
static int net_ads_password (int argc, const char **argv)
int net_ads_changetrustpw (int argc, const char **argv)
static int net_ads_search_usage (int argc, const char **argv)
static int net_ads_search (int argc, const char **argv)
static int net_ads_dn_usage (int argc, const char **argv)
static int net_ads_dn (int argc, const char **argv)
static int net_ads_sid_usage (int argc, const char **argv)
static int net_ads_sid (int argc, const char **argv)
static int net_ads_keytab_usage (int argc, const char **argv)
static int net_ads_keytab_flush (int argc, const char **argv)
static int net_ads_keytab_add (int argc, const char **argv)
static int net_ads_keytab_create (int argc, const char **argv)
int net_ads_keytab (int argc, const char **argv)
int net_ads_help (int argc, const char **argv)
int net_ads (int argc, const char **argv)
static int net_ads_noads (void)


関数

int net_ads_usage ( int  argc,
const char **  argv 
)

net_ads.c29 行で定義されています。

参照先 d_printf().

参照元 net_ads()net_ads_help().

00030 {
00031         d_printf("join [createupn[=principal]] [createcomputer=<org_unit>]\n");
00032         d_printf("    Join the local machine to a ADS realm\n");
00033         d_printf("leave\n");
00034         d_printf("    Remove the local machine from a ADS realm\n");
00035         d_printf("testjoin\n");
00036         d_printf("    Validates the machine account in the domain\n");
00037         d_printf("user\n");
00038         d_printf("    List, add, or delete users in the realm\n");
00039         d_printf("group\n");
00040         d_printf("    List, add, or delete groups in the realm\n");
00041         d_printf("info\n");
00042         d_printf("    Displays details regarding a specific AD server\n");
00043         d_printf("status\n");
00044         d_printf("    Display details regarding the machine's account in AD\n");
00045         d_printf("lookup\n");
00046         d_printf("    Performs CLDAP query of AD domain controllers\n");
00047         d_printf("password <username@realm> <password> -Uadmin_username@realm%%admin_pass\n");
00048         d_printf("    Change a user's password using an admin account\n");
00049         d_printf("    (note: use realm in UPPERCASE, prompts if password is obmitted)\n");
00050         d_printf("changetrustpw\n");
00051         d_printf("    Change the trust account password of this machine in the AD tree\n");
00052         d_printf("printer [info | publish | remove] <printername> <servername>\n");
00053         d_printf("    Lookup, add, or remove directory entry for a printer\n");
00054         d_printf("{search,dn,sid}\n");
00055         d_printf("    Issue LDAP search queries using a general filter, by DN, or by SID\n");
00056         d_printf("keytab\n");
00057         d_printf("    Manage a local keytab file based on the machine account in AD\n");
00058         d_printf("dns\n");
00059         d_printf("    Issue a dynamic DNS update request the server's hostname\n");
00060         d_printf("    (using the machine credentials)\n");
00061         
00062         return -1;
00063 }

static const char* assume_own_realm ( void   )  [static]

net_ads.c68 行で定義されています。

参照先 lp_workgroup()opt_hostopt_target_workgroupstrequal().

参照元 ads_startup_int().

00069 {
00070         if (!opt_host && strequal(lp_workgroup(), opt_target_workgroup)) {
00071                 return lp_realm();
00072         }
00073 
00074         return NULL;
00075 }

static int net_ads_cldap_netlogon ( ADS_STRUCT ads  )  [static]

net_ads.c80 行で定義されています。

参照先 ads_cldap_netlogon()cldap_netlogon_reply::client_site_named_fprintf()d_printf()cldap_netlogon_reply::domaincldap_netlogon_reply::flagscldap_netlogon_reply::forestcldap_netlogon_reply::guidcldap_netlogon_reply::hostnameADS_STRUCT::ldap_ipcldap_netlogon_reply::lm20_tokencldap_netlogon_reply::lmnt_tokencldap_netlogon_reply::netbios_domaincldap_netlogon_reply::netbios_hostnameprintf()ADS_STRUCT::realmADS_STRUCT::servercldap_netlogon_reply::server_site_namesmb_uuid_string_static()smb_uuid_unpack_static()cldap_netlogon_reply::typecldap_netlogon_reply::unkcldap_netlogon_reply::user_namecldap_netlogon_reply::version.

参照元 net_ads_lookup().

00081 {
00082         struct cldap_netlogon_reply reply;
00083 
00084         if ( !ads_cldap_netlogon( inet_ntoa(ads->ldap_ip), ads->server.realm, &reply ) ) {
00085                 d_fprintf(stderr, "CLDAP query failed!\n");
00086                 return -1;
00087         }
00088 
00089         d_printf("Information for Domain Controller: %s\n\n", 
00090                 inet_ntoa(ads->ldap_ip));
00091 
00092         d_printf("Response Type: ");
00093         switch (reply.type) {
00094         case SAMLOGON_AD_UNK_R:
00095                 d_printf("SAMLOGON\n");
00096                 break;
00097         case SAMLOGON_AD_R:
00098                 d_printf("SAMLOGON_USER\n");
00099                 break;
00100         default:
00101                 d_printf("0x%x\n", reply.type);
00102                 break;
00103         }
00104         d_printf("GUID: %s\n", 
00105                  smb_uuid_string_static(smb_uuid_unpack_static(reply.guid))); 
00106         d_printf("Flags:\n"
00107                  "\tIs a PDC:                                   %s\n"
00108                  "\tIs a GC of the forest:                      %s\n"
00109                  "\tIs an LDAP server:                          %s\n"
00110                  "\tSupports DS:                                %s\n"
00111                  "\tIs running a KDC:                           %s\n"
00112                  "\tIs running time services:                   %s\n"
00113                  "\tIs the closest DC:                          %s\n"
00114                  "\tIs writable:                                %s\n"
00115                  "\tHas a hardware clock:                       %s\n"
00116                  "\tIs a non-domain NC serviced by LDAP server: %s\n",
00117                  (reply.flags & ADS_PDC) ? "yes" : "no",
00118                  (reply.flags & ADS_GC) ? "yes" : "no",
00119                  (reply.flags & ADS_LDAP) ? "yes" : "no",
00120                  (reply.flags & ADS_DS) ? "yes" : "no",
00121                  (reply.flags & ADS_KDC) ? "yes" : "no",
00122                  (reply.flags & ADS_TIMESERV) ? "yes" : "no",
00123                  (reply.flags & ADS_CLOSEST) ? "yes" : "no",
00124                  (reply.flags & ADS_WRITABLE) ? "yes" : "no",
00125                  (reply.flags & ADS_GOOD_TIMESERV) ? "yes" : "no",
00126                  (reply.flags & ADS_NDNC) ? "yes" : "no");
00127 
00128         printf("Forest:\t\t\t%s\n", reply.forest);
00129         printf("Domain:\t\t\t%s\n", reply.domain);
00130         printf("Domain Controller:\t%s\n", reply.hostname);
00131 
00132         printf("Pre-Win2k Domain:\t%s\n", reply.netbios_domain);
00133         printf("Pre-Win2k Hostname:\t%s\n", reply.netbios_hostname);
00134 
00135         if (*reply.unk) printf("Unk:\t\t\t%s\n", reply.unk);
00136         if (*reply.user_name) printf("User name:\t%s\n", reply.user_name);
00137 
00138         printf("Server Site Name :\t\t%s\n", reply.server_site_name);
00139         printf("Client Site Name :\t\t%s\n", reply.client_site_name);
00140 
00141         d_printf("NT Version: %d\n", reply.version);
00142         d_printf("LMNT Token: %.2x\n", reply.lmnt_token);
00143         d_printf("LM20 Token: %.2x\n", reply.lm20_token);
00144 
00145         return 0;
00146 }

static int net_ads_lookup ( int  argc,
const char **  argv 
) [static]

net_ads.c153 行で定義されています。

参照先 ads_startup_nobind()ADS_STRUCT::configd_fprintf()ADS_STRUCT::ldap_portnet_ads_cldap_netlogon()opt_target_workgroupADS_STRUCT::realm.

参照元 net_ads().

00154 {
00155         ADS_STRUCT *ads;
00156 
00157         if (!ADS_ERR_OK(ads_startup_nobind(False, &ads))) {
00158                 d_fprintf(stderr, "Didn't find the cldap server!\n");
00159                 return -1;
00160         }
00161 
00162         if (!ads->config.realm) {
00163                 ads->config.realm = CONST_DISCARD(char *, opt_target_workgroup);
00164                 ads->ldap_port = 389;
00165         }
00166 
00167         return net_ads_cldap_netlogon(ads);
00168 }

static int net_ads_info ( int  argc,
const char **  argv 
) [static]

net_ads.c172 行で定義されています。

参照先 ads_current_time()ads_startup_nobind()ADS_STRUCT::authADS_STRUCT::bind_pathADS_STRUCT::configADS_STRUCT::current_timed_fprintf()d_printf()http_timestring()ADS_STRUCT::kdc_serverADS_STRUCT::ldap_ipADS_STRUCT::ldap_portADS_STRUCT::ldap_server_nameADS_STRUCT::realmADS_STRUCT::time_offset.

参照元 net_ads()net_ads_help().

00173 {
00174         ADS_STRUCT *ads;
00175 
00176         if (!ADS_ERR_OK(ads_startup_nobind(False, &ads))) {
00177                 d_fprintf(stderr, "Didn't find the ldap server!\n");
00178                 return -1;
00179         }
00180 
00181         if (!ads || !ads->config.realm) {
00182                 d_fprintf(stderr, "Didn't find the ldap server!\n");
00183                 return -1;
00184         }
00185 
00186         /* Try to set the server's current time since we didn't do a full
00187            TCP LDAP session initially */
00188 
00189         if ( !ADS_ERR_OK(ads_current_time( ads )) ) {
00190                 d_fprintf( stderr, "Failed to get server's current time!\n");
00191         }
00192 
00193         d_printf("LDAP server: %s\n", inet_ntoa(ads->ldap_ip));
00194         d_printf("LDAP server name: %s\n", ads->config.ldap_server_name);
00195         d_printf("Realm: %s\n", ads->config.realm);
00196         d_printf("Bind Path: %s\n", ads->config.bind_path);
00197         d_printf("LDAP port: %d\n", ads->ldap_port);
00198         d_printf("Server time: %s\n", http_timestring(ads->config.current_time));
00199 
00200         d_printf("KDC server: %s\n", ads->auth.kdc_server );
00201         d_printf("Server time offset: %d\n", ads->auth.time_offset );
00202 
00203         return 0;
00204 }

static void use_in_memory_ccache ( void   )  [static]

net_ads.c206 行で定義されています。

参照先 setenv().

00206                                        {
00207         /* Use in-memory credentials cache so we do not interfere with
00208          * existing credentials */
00209         setenv(KRB5_ENV_CCNAME, "MEMORY:net_ads", 1);
00210 }

static ADS_STATUS ads_startup_int ( BOOL  only_own_domain,
uint32  auth_flags,
ADS_STRUCT **  ads_ret 
) [static]

net_ads.c212 行で定義されています。

参照先 ads_connect()ads_destroy()ads_errstr()ads_init()ads_ntstatus()asprintf()assume_own_realm()ADS_STRUCT::authADS_STRUCT::configADS_STRUCT::flagsnamecache_delete()opt_hostopt_machine_passopt_passwordopt_target_workgroupopt_user_nameopt_user_specifiedADS_STRUCT::passwordpromptADS_STRUCT::realmADS_STRUCT::serversmb_xstrdup()statusstrchr_m()strupper_m()ADS_STRUCT::tried_closest_dcuse_in_memory_ccache()ADS_STRUCT::user_nameADS_STRUCT::workgroup.

参照元 ads_startup()ads_startup_nobind().

00213 {
00214         ADS_STRUCT *ads = NULL;
00215         ADS_STATUS status;
00216         BOOL need_password = False;
00217         BOOL second_time = False;
00218         char *cp;
00219         const char *realm = NULL;
00220         BOOL tried_closest_dc = False;
00221 
00222         /* lp_realm() should be handled by a command line param, 
00223            However, the join requires that realm be set in smb.conf
00224            and compares our realm with the remote server's so this is
00225            ok until someone needs more flexibility */
00226 
00227         *ads_ret = NULL;
00228 
00229 retry_connect:
00230         if (only_own_domain) {
00231                 realm = lp_realm();
00232         } else {
00233                 realm = assume_own_realm();
00234         }
00235 
00236         ads = ads_init(realm, opt_target_workgroup, opt_host);
00237 
00238         if (!opt_user_name) {
00239                 opt_user_name = "administrator";
00240         }
00241 
00242         if (opt_user_specified) {
00243                 need_password = True;
00244         }
00245 
00246 retry:
00247         if (!opt_password && need_password && !opt_machine_pass) {
00248                 char *prompt = NULL;
00249                 asprintf(&prompt,"%s's password: ", opt_user_name);
00250                 if (!prompt) {
00251                         ads_destroy(&ads);
00252                         return ADS_ERROR(LDAP_NO_MEMORY);
00253                 }
00254                 opt_password = getpass(prompt);
00255                 free(prompt);
00256         }
00257 
00258         if (opt_password) {
00259                 use_in_memory_ccache();
00260                 SAFE_FREE(ads->auth.password);
00261                 ads->auth.password = smb_xstrdup(opt_password);
00262         }
00263 
00264         ads->auth.flags |= auth_flags;
00265         SAFE_FREE(ads->auth.user_name);
00266         ads->auth.user_name = smb_xstrdup(opt_user_name);
00267 
00268        /*
00269         * If the username is of the form "name@realm", 
00270         * extract the realm and convert to upper case.
00271         * This is only used to establish the connection.
00272         */
00273        if ((cp = strchr_m(ads->auth.user_name, '@'))!=0) {
00274                 *cp++ = '\0';
00275                 SAFE_FREE(ads->auth.realm);
00276                 ads->auth.realm = smb_xstrdup(cp);
00277                 strupper_m(ads->auth.realm);
00278        }
00279 
00280         status = ads_connect(ads);
00281 
00282         if (!ADS_ERR_OK(status)) {
00283 
00284                 if (NT_STATUS_EQUAL(ads_ntstatus(status), 
00285                                     NT_STATUS_NO_LOGON_SERVERS)) {
00286                         DEBUG(0,("ads_connect: %s\n", ads_errstr(status)));
00287                         ads_destroy(&ads);
00288                         return status;
00289                 }
00290         
00291                 if (!need_password && !second_time && !(auth_flags & ADS_AUTH_NO_BIND)) {
00292                         need_password = True;
00293                         second_time = True;
00294                         goto retry;
00295                 } else {
00296                         ads_destroy(&ads);
00297                         return status;
00298                 }
00299         }
00300 
00301         /* when contacting our own domain, make sure we use the closest DC.
00302          * This is done by reconnecting to ADS because only the first call to
00303          * ads_connect will give us our own sitename */
00304 
00305         if ((only_own_domain || !opt_host) && !tried_closest_dc) {
00306 
00307                 tried_closest_dc = True; /* avoid loop */
00308 
00309                 if (!ads->config.tried_closest_dc) {
00310 
00311                         namecache_delete(ads->server.realm, 0x1C);
00312                         namecache_delete(ads->server.workgroup, 0x1C);
00313 
00314                         ads_destroy(&ads);
00315                         ads = NULL;
00316 
00317                         goto retry_connect;
00318                 }
00319         }
00320 
00321         *ads_ret = ads;
00322         return status;
00323 }

ADS_STATUS ads_startup ( BOOL  only_own_domain,
ADS_STRUCT **  ads 
)

net_ads.c325 行で定義されています。

参照先 ads_startup_int().

参照元 ads_group_add()ads_group_delete()ads_user_add()ads_user_delete()ads_user_info()net_ads_changetrustpw()net_ads_dn()net_ads_dns_register()net_ads_gpo_add_link()net_ads_gpo_apply()net_ads_gpo_delete_link()net_ads_gpo_get_gpo()net_ads_gpo_get_link()net_ads_gpo_list()net_ads_gpo_refresh()net_ads_group()net_ads_join()net_ads_join_ok()net_ads_keytab_add()net_ads_keytab_create()net_ads_keytab_flush()net_ads_leave()net_ads_printer_info()net_ads_printer_publish()net_ads_printer_remove()net_ads_printer_search()net_ads_search()net_ads_sid()net_ads_status()net_ads_user().

00326 {
00327         return ads_startup_int(only_own_domain, 0, ads);
00328 }

ADS_STATUS ads_startup_nobind ( BOOL  only_own_domain,
ADS_STRUCT **  ads 
)

net_ads.c330 行で定義されています。

参照先 ads_startup_int().

参照元 net_ads_info()net_ads_lookup()net_ads_workgroup().

00331 {
00332         return ads_startup_int(only_own_domain, ADS_AUTH_NO_BIND, ads);
00333 }

static int net_ads_check_int ( const char *  realm,
const char *  workgroup,
const char *  host 
) [static]

net_ads.c340 行で定義されています。

参照先 ads_connect()ads_destroy()ads_init()ADS_STRUCT::authADS_STRUCT::flagsstatus.

参照元 net_ads_check()net_ads_check_our_domain().

00341 {
00342         ADS_STRUCT *ads;
00343         ADS_STATUS status;
00344 
00345         if ( (ads = ads_init( realm, workgroup, host )) == NULL ) {
00346                 return -1;
00347         }
00348 
00349         ads->auth.flags |= ADS_AUTH_NO_BIND;
00350 
00351         status = ads_connect(ads);
00352         if ( !ADS_ERR_OK(status) ) {
00353                 return -1;
00354         }
00355 
00356         ads_destroy(&ads);
00357         return 0;
00358 }

int net_ads_check_our_domain ( void   ) 

net_ads.c360 行で定義されています。

参照先 lp_workgroup()net_ads_check_int().

参照元 net_changetrustpw()net_join().

00361 {
00362         return net_ads_check_int(lp_realm(), lp_workgroup(), NULL);
00363 }

int net_ads_check ( void   ) 

net_ads.c365 行で定義されています。

参照先 net_ads_check_int()opt_hostopt_workgroup.

参照元 net_group()net_user().

00366 {
00367         return net_ads_check_int(NULL, opt_workgroup, opt_host);
00368 }

static int net_ads_workgroup ( int  argc,
const char **  argv 
) [static]

net_ads.c372 行で定義されています。

参照先 ads_cldap_netlogon()ads_destroy()ads_startup_nobind()ADS_STRUCT::configd_fprintf()d_printf()ADS_STRUCT::ldap_ipADS_STRUCT::ldap_portcldap_netlogon_reply::netbios_domainopt_target_workgroupADS_STRUCT::realmADS_STRUCT::server.

参照元 net_ads().

00373 {
00374         ADS_STRUCT *ads;
00375         struct cldap_netlogon_reply reply;
00376 
00377         if (!ADS_ERR_OK(ads_startup_nobind(False, &ads))) {
00378                 d_fprintf(stderr, "Didn't find the cldap server!\n");
00379                 return -1;
00380         }
00381         
00382         if (!ads->config.realm) {
00383                 ads->config.realm = CONST_DISCARD(char *, opt_target_workgroup);
00384                 ads->ldap_port = 389;
00385         }
00386         
00387         if ( !ads_cldap_netlogon( inet_ntoa(ads->ldap_ip), ads->server.realm, &reply ) ) {
00388                 d_fprintf(stderr, "CLDAP query failed!\n");
00389                 return -1;
00390         }
00391 
00392         d_printf("Workgroup: %s\n", reply.netbios_domain);
00393 
00394         ads_destroy(&ads);
00395         
00396         return 0;
00397 }

static BOOL usergrp_display ( char *  field,
void **  values,
void *  data_area 
) [static]

net_ads.c401 行で定義されています。

参照先 d_printf()StrCaseCmp()strchr_m().

参照元 net_ads_group()net_ads_user().

00402 {
00403         char **disp_fields = (char **) data_area;
00404 
00405         if (!field) { /* must be end of record */
00406                 if (disp_fields[0]) {
00407                         if (!strchr_m(disp_fields[0], '$')) {
00408                                 if (disp_fields[1])
00409                                         d_printf("%-21.21s %s\n", 
00410                                                disp_fields[0], disp_fields[1]);
00411                                 else
00412                                         d_printf("%s\n", disp_fields[0]);
00413                         }
00414                 }
00415                 SAFE_FREE(disp_fields[0]);
00416                 SAFE_FREE(disp_fields[1]);
00417                 return True;
00418         }
00419         if (!values) /* must be new field, indicate string field */
00420                 return True;
00421         if (StrCaseCmp(field, "sAMAccountName") == 0) {
00422                 disp_fields[0] = SMB_STRDUP((char *) values[0]);
00423         }
00424         if (StrCaseCmp(field, "description") == 0)
00425                 disp_fields[1] = SMB_STRDUP((char *) values[0]);
00426         return True;
00427 }

static int net_ads_user_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c429 行で定義されています。

参照先 net_help_user().

参照元 ads_user_add()ads_user_delete()ads_user_info()net_ads_help()net_ads_user().

00430 {
00431         return net_help_user(argc, argv);
00432 } 

static int ads_user_add ( int  argc,
const char **  argv 
) [static]

net_ads.c434 行で定義されています。

参照先 ads_add_user_acct()ads_count_replies()ads_default_ou_string()ads_del_dn()ads_destroy()ads_errstr()ads_find_user_acct()ads_get_dn()ads_krb5_set_password()ads_memfree()ads_msgfree()ads_startup()asprintf()ADS_STRUCT::authADS_STRUCT::configd_fprintf()d_printf()ADS_STRUCT::kdc_servernet_ads_user_usage()opt_commentopt_containerADS_STRUCT::realmsafe_free()statusADS_STRUCT::time_offset.

参照元 net_ads_user().

00435 {
00436         ADS_STRUCT *ads;
00437         ADS_STATUS status;
00438         char *upn, *userdn;
00439         LDAPMessage *res=NULL;
00440         int rc = -1;
00441         char *ou_str = NULL;
00442 
00443         if (argc < 1) return net_ads_user_usage(argc, argv);
00444         
00445         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
00446                 return -1;
00447         }
00448 
00449         status = ads_find_user_acct(ads, &res, argv[0]);
00450 
00451         if (!ADS_ERR_OK(status)) {
00452                 d_fprintf(stderr, "ads_user_add: %s\n", ads_errstr(status));
00453                 goto done;
00454         }
00455         
00456         if (ads_count_replies(ads, res)) {
00457                 d_fprintf(stderr, "ads_user_add: User %s already exists\n", argv[0]);
00458                 goto done;
00459         }
00460 
00461         if (opt_container) {
00462                 ou_str = SMB_STRDUP(opt_container);
00463         } else {
00464                 ou_str = ads_default_ou_string(ads, WELL_KNOWN_GUID_USERS);
00465         }
00466 
00467         status = ads_add_user_acct(ads, argv[0], ou_str, opt_comment);
00468 
00469         if (!ADS_ERR_OK(status)) {
00470                 d_fprintf(stderr, "Could not add user %s: %s\n", argv[0],
00471                          ads_errstr(status));
00472                 goto done;
00473         }
00474 
00475         /* if no password is to be set, we're done */
00476         if (argc == 1) { 
00477                 d_printf("User %s added\n", argv[0]);
00478                 rc = 0;
00479                 goto done;
00480         }
00481 
00482         /* try setting the password */
00483         asprintf(&upn, "%s@%s", argv[0], ads->config.realm);
00484         status = ads_krb5_set_password(ads->auth.kdc_server, upn, argv[1], 
00485                                        ads->auth.time_offset);
00486         safe_free(upn);
00487         if (ADS_ERR_OK(status)) {
00488                 d_printf("User %s added\n", argv[0]);
00489                 rc = 0;
00490                 goto done;
00491         }
00492 
00493         /* password didn't set, delete account */
00494         d_fprintf(stderr, "Could not add user %s.  Error setting password %s\n",
00495                  argv[0], ads_errstr(status));
00496         ads_msgfree(ads, res);
00497         status=ads_find_user_acct(ads, &res, argv[0]);
00498         if (ADS_ERR_OK(status)) {
00499                 userdn = ads_get_dn(ads, res);
00500                 ads_del_dn(ads, userdn);
00501                 ads_memfree(ads, userdn);
00502         }
00503 
00504  done:
00505         if (res)
00506                 ads_msgfree(ads, res);
00507         ads_destroy(&ads);
00508         SAFE_FREE(ou_str);
00509         return rc;
00510 }

static int ads_user_info ( int  argc,
const char **  argv 
) [static]

net_ads.c512 行で定義されています。

参照先 ads_destroy()ads_errstr()ads_msgfree()ads_search()ads_startup()asprintf()d_fprintf()d_printf()escape_ldap_string_alloc()ADS_STRUCT::ldnet_ads_user_usage()safe_free().

参照元 net_ads_user().

00513 {
00514         ADS_STRUCT *ads;
00515         ADS_STATUS rc;
00516         LDAPMessage *res;
00517         const char *attrs[] = {"memberOf", NULL};
00518         char *searchstring=NULL;
00519         char **grouplist;
00520         char *escaped_user;
00521 
00522         if (argc < 1) {
00523                 return net_ads_user_usage(argc, argv);
00524         }
00525 
00526         escaped_user = escape_ldap_string_alloc(argv[0]);
00527 
00528         if (!escaped_user) {
00529                 d_fprintf(stderr, "ads_user_info: failed to escape user %s\n", argv[0]);
00530                 return -1;
00531         }
00532 
00533         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
00534                 SAFE_FREE(escaped_user);
00535                 return -1;
00536         }
00537 
00538         asprintf(&searchstring, "(sAMAccountName=%s)", escaped_user);
00539         rc = ads_search(ads, &res, searchstring, attrs);
00540         safe_free(searchstring);
00541 
00542         if (!ADS_ERR_OK(rc)) {
00543                 d_fprintf(stderr, "ads_search: %s\n", ads_errstr(rc));
00544                 ads_destroy(&ads);
00545                 SAFE_FREE(escaped_user);
00546                 return -1;
00547         }
00548         
00549         grouplist = ldap_get_values((LDAP *)ads->ld,
00550                                     (LDAPMessage *)res, "memberOf");
00551 
00552         if (grouplist) {
00553                 int i;
00554                 char **groupname;
00555                 for (i=0;grouplist[i];i++) {
00556                         groupname = ldap_explode_dn(grouplist[i], 1);
00557                         d_printf("%s\n", groupname[0]);
00558                         ldap_value_free(groupname);
00559                 }
00560                 ldap_value_free(grouplist);
00561         }
00562         
00563         ads_msgfree(ads, res);
00564         ads_destroy(&ads);
00565         SAFE_FREE(escaped_user);
00566         return 0;
00567 }

static int ads_user_delete ( int  argc,
const char **  argv 
) [static]

net_ads.c569 行で定義されています。

参照先 ads_count_replies()ads_del_dn()ads_destroy()ads_errstr()ads_find_user_acct()ads_get_dn()ads_memfree()ads_msgfree()ads_startup()d_fprintf()d_printf()net_ads_user_usage().

参照元 net_ads_user().

00570 {
00571         ADS_STRUCT *ads;
00572         ADS_STATUS rc;
00573         LDAPMessage *res = NULL;
00574         char *userdn;
00575 
00576         if (argc < 1) {
00577                 return net_ads_user_usage(argc, argv);
00578         }
00579         
00580         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
00581                 return -1;
00582         }
00583 
00584         rc = ads_find_user_acct(ads, &res, argv[0]);
00585         if (!ADS_ERR_OK(rc) || ads_count_replies(ads, res) != 1) {
00586                 d_printf("User %s does not exist.\n", argv[0]);
00587                 ads_msgfree(ads, res);
00588                 ads_destroy(&ads);
00589                 return -1;
00590         }
00591         userdn = ads_get_dn(ads, res);
00592         ads_msgfree(ads, res);
00593         rc = ads_del_dn(ads, userdn);
00594         ads_memfree(ads, userdn);
00595         if (ADS_ERR_OK(rc)) {
00596                 d_printf("User %s deleted\n", argv[0]);
00597                 ads_destroy(&ads);
00598                 return 0;
00599         }
00600         d_fprintf(stderr, "Error deleting user %s: %s\n", argv[0], 
00601                  ads_errstr(rc));
00602         ads_destroy(&ads);
00603         return -1;
00604 }

int net_ads_user ( int  argc,
const char **  argv 
)

net_ads.c606 行で定義されています。

参照先 ads_destroy()ads_do_search_all_fn()ads_startup()ads_user_add()ads_user_delete()ads_user_info()ADS_STRUCT::bind_pathADS_STRUCT::configd_printf()net_ads_user_usage()net_run_function()opt_long_list_entriesusergrp_display().

参照元 net_ads()net_user().

00607 {
00608         struct functable func[] = {
00609                 {"ADD", ads_user_add},
00610                 {"INFO", ads_user_info},
00611                 {"DELETE", ads_user_delete},
00612                 {NULL, NULL}
00613         };
00614         ADS_STRUCT *ads;
00615         ADS_STATUS rc;
00616         const char *shortattrs[] = {"sAMAccountName", NULL};
00617         const char *longattrs[] = {"sAMAccountName", "description", NULL};
00618         char *disp_fields[2] = {NULL, NULL};
00619         
00620         if (argc == 0) {
00621                 if (!ADS_ERR_OK(ads_startup(False, &ads))) {
00622                         return -1;
00623                 }
00624 
00625                 if (opt_long_list_entries)
00626                         d_printf("\nUser name             Comment"\
00627                                  "\n-----------------------------\n");
00628 
00629                 rc = ads_do_search_all_fn(ads, ads->config.bind_path, 
00630                                           LDAP_SCOPE_SUBTREE,
00631                                           "(objectCategory=user)", 
00632                                           opt_long_list_entries ? longattrs :
00633                                           shortattrs, usergrp_display, 
00634                                           disp_fields);
00635                 ads_destroy(&ads);
00636                 return ADS_ERR_OK(rc) ? 0 : -1;
00637         }
00638 
00639         return net_run_function(argc, argv, func, net_ads_user_usage);
00640 }

static int net_ads_group_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c642 行で定義されています。

参照先 net_help_group().

参照元 ads_group_add()ads_group_delete()net_ads_group()net_ads_help().

00643 {
00644         return net_help_group(argc, argv);
00645 } 

static int ads_group_add ( int  argc,
const char **  argv 
) [static]

net_ads.c647 行で定義されています。

参照先 ads_add_group_acct()ads_count_replies()ads_default_ou_string()ads_destroy()ads_errstr()ads_find_user_acct()ads_msgfree()ads_startup()d_fprintf()d_printf()net_ads_group_usage()opt_commentopt_containerstatus.

参照元 net_ads_group().

00648 {
00649         ADS_STRUCT *ads;
00650         ADS_STATUS status;
00651         LDAPMessage *res=NULL;
00652         int rc = -1;
00653         char *ou_str = NULL;
00654 
00655         if (argc < 1) {
00656                 return net_ads_group_usage(argc, argv);
00657         }
00658         
00659         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
00660                 return -1;
00661         }
00662 
00663         status = ads_find_user_acct(ads, &res, argv[0]);
00664 
00665         if (!ADS_ERR_OK(status)) {
00666                 d_fprintf(stderr, "ads_group_add: %s\n", ads_errstr(status));
00667                 goto done;
00668         }
00669         
00670         if (ads_count_replies(ads, res)) {
00671                 d_fprintf(stderr, "ads_group_add: Group %s already exists\n", argv[0]);
00672                 goto done;
00673         }
00674 
00675         if (opt_container) {
00676                 ou_str = SMB_STRDUP(opt_container);
00677         } else {
00678                 ou_str = ads_default_ou_string(ads, WELL_KNOWN_GUID_USERS);
00679         }
00680 
00681         status = ads_add_group_acct(ads, argv[0], ou_str, opt_comment);
00682 
00683         if (ADS_ERR_OK(status)) {
00684                 d_printf("Group %s added\n", argv[0]);
00685                 rc = 0;
00686         } else {
00687                 d_fprintf(stderr, "Could not add group %s: %s\n", argv[0],
00688                          ads_errstr(status));
00689         }
00690 
00691  done:
00692         if (res)
00693                 ads_msgfree(ads, res);
00694         ads_destroy(&ads);
00695         SAFE_FREE(ou_str);
00696         return rc;
00697 }

static int ads_group_delete ( int  argc,
const char **  argv 
) [static]

net_ads.c699 行で定義されています。

参照先 ads_count_replies()ads_del_dn()ads_destroy()ads_errstr()ads_find_user_acct()ads_get_dn()ads_memfree()ads_msgfree()ads_startup()d_fprintf()d_printf()net_ads_group_usage().

参照元 net_ads_group().

00700 {
00701         ADS_STRUCT *ads;
00702         ADS_STATUS rc;
00703         LDAPMessage *res = NULL;
00704         char *groupdn;
00705 
00706         if (argc < 1) {
00707                 return net_ads_group_usage(argc, argv);
00708         }
00709         
00710         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
00711                 return -1;
00712         }
00713 
00714         rc = ads_find_user_acct(ads, &res, argv[0]);
00715         if (!ADS_ERR_OK(rc) || ads_count_replies(ads, res) != 1) {
00716                 d_printf("Group %s does not exist.\n", argv[0]);
00717                 ads_msgfree(ads, res);
00718                 ads_destroy(&ads);
00719                 return -1;
00720         }
00721         groupdn = ads_get_dn(ads, res);
00722         ads_msgfree(ads, res);
00723         rc = ads_del_dn(ads, groupdn);
00724         ads_memfree(ads, groupdn);
00725         if (ADS_ERR_OK(rc)) {
00726                 d_printf("Group %s deleted\n", argv[0]);
00727                 ads_destroy(&ads);
00728                 return 0;
00729         }
00730         d_fprintf(stderr, "Error deleting group %s: %s\n", argv[0], 
00731                  ads_errstr(rc));
00732         ads_destroy(&ads);
00733         return -1;
00734 }

int net_ads_group ( int  argc,
const char **  argv 
)

net_ads.c736 行で定義されています。

参照先 ads_destroy()ads_do_search_all_fn()ads_group_add()ads_group_delete()ads_startup()ADS_STRUCT::bind_pathADS_STRUCT::configd_printf()net_ads_group_usage()net_run_function()opt_long_list_entriesusergrp_display().

参照元 net_ads()net_group().

00737 {
00738         struct functable func[] = {
00739                 {"ADD", ads_group_add},
00740                 {"DELETE", ads_group_delete},
00741                 {NULL, NULL}
00742         };
00743         ADS_STRUCT *ads;
00744         ADS_STATUS rc;
00745         const char *shortattrs[] = {"sAMAccountName", NULL};
00746         const char *longattrs[] = {"sAMAccountName", "description", NULL};
00747         char *disp_fields[2] = {NULL, NULL};
00748 
00749         if (argc == 0) {
00750                 if (!ADS_ERR_OK(ads_startup(False, &ads))) {
00751                         return -1;
00752                 }
00753 
00754                 if (opt_long_list_entries)
00755                         d_printf("\nGroup name            Comment"\
00756                                  "\n-----------------------------\n");
00757                 rc = ads_do_search_all_fn(ads, ads->config.bind_path, 
00758                                           LDAP_SCOPE_SUBTREE, 
00759                                           "(objectCategory=group)", 
00760                                           opt_long_list_entries ? longattrs : 
00761                                           shortattrs, usergrp_display, 
00762                                           disp_fields);
00763 
00764                 ads_destroy(&ads);
00765                 return ADS_ERR_OK(rc) ? 0 : -1;
00766         }
00767         return net_run_function(argc, argv, func, net_ads_group_usage);
00768 }

static int net_ads_status ( int  argc,
const char **  argv 
) [static]

net_ads.c770 行で定義されています。

参照先 ads_count_replies()ads_destroy()ads_dump()ads_errstr()ads_find_machine_acct()ads_startup()d_fprintf()global_myname.

参照元 net_ads()net_ads_help().

00771 {
00772         ADS_STRUCT *ads;
00773         ADS_STATUS rc;
00774         LDAPMessage *res;
00775 
00776         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
00777                 return -1;
00778         }
00779 
00780         rc = ads_find_machine_acct(ads, &res, global_myname());
00781         if (!ADS_ERR_OK(rc)) {
00782                 d_fprintf(stderr, "ads_find_machine_acct: %s\n", ads_errstr(rc));
00783                 ads_destroy(&ads);
00784                 return -1;
00785         }
00786 
00787         if (ads_count_replies(ads, res) == 0) {
00788                 d_fprintf(stderr, "No machine account for '%s' found\n", global_myname());
00789                 ads_destroy(&ads);
00790                 return -1;
00791         }
00792 
00793         ads_dump(ads, res);
00794         ads_destroy(&ads);
00795         return 0;
00796 }

static int net_ads_leave ( int  argc,
const char **  argv 
) [static]

net_ads.c805 行で定義されています。

参照先 ads_destroy()ads_leave_realm()ads_startup()clicli_shutdown()ADS_STRUCT::configconnect_to_ipc_krb5()ctxd_fprintf()d_printf()global_mynameADS_STRUCT::ldap_ipADS_STRUCT::ldap_server_namenetdom_get_domain_sid()netdom_leave_domain()ADS_STRUCT::realmsaf_delete()secrets_init()statustalloc_init().

参照元 net_ads()net_ads_help()net_ads_join().

00806 {
00807         ADS_STRUCT *ads = NULL;
00808         ADS_STATUS adsret;
00809         NTSTATUS status;
00810         int ret = -1;
00811         struct cli_state *cli = NULL;
00812         TALLOC_CTX *ctx;
00813         DOM_SID *dom_sid = NULL;
00814         char *short_domain_name = NULL;      
00815 
00816         if (!secrets_init()) {
00817                 DEBUG(1,("Failed to initialise secrets database\n"));
00818                 return -1;
00819         }
00820 
00821         if (!(ctx = talloc_init("net_ads_leave"))) {
00822                 d_fprintf(stderr, "Could not initialise talloc context.\n");
00823                 return -1;
00824         }
00825 
00826         /* The finds a DC and takes care of getting the 
00827            user creds if necessary */
00828 
00829         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
00830                 return -1;
00831         }
00832 
00833         /* make RPC calls here */
00834 
00835         if ( !NT_STATUS_IS_OK(connect_to_ipc_krb5(&cli, &ads->ldap_ip, 
00836                 ads->config.ldap_server_name)) )
00837         {
00838                 goto done;
00839         }
00840         
00841         if ( !NT_STATUS_IS_OK(netdom_get_domain_sid( ctx, cli, &short_domain_name, &dom_sid )) ) {
00842                 goto done;
00843         }
00844 
00845         saf_delete( short_domain_name );
00846 
00847         status = netdom_leave_domain(ctx, cli, dom_sid);
00848 
00849         /* Try and delete it via LDAP - the old way we used to. */
00850 
00851         adsret = ads_leave_realm(ads, global_myname());
00852         if (ADS_ERR_OK(adsret)) {
00853                 d_printf("Deleted account for '%s' in realm '%s'\n",
00854                         global_myname(), ads->config.realm);
00855                 ret = 0;
00856         } else {
00857                 /* We couldn't delete it - see if the disable succeeded. */
00858                 if (NT_STATUS_IS_OK(status)) {
00859                         d_printf("Disabled account for '%s' in realm '%s'\n",
00860                                 global_myname(), ads->config.realm);
00861                         ret = 0;
00862                 } else {
00863                         d_fprintf(stderr, "Failed to disable machine account for '%s' in realm '%s'\n",
00864                                 global_myname(), ads->config.realm);
00865                 }
00866         }
00867 
00868 done:
00869 
00870         if ( cli ) 
00871                 cli_shutdown(cli);
00872 
00873         ads_destroy(&ads);
00874         TALLOC_FREE( ctx );
00875 
00876         return ret;
00877 }

static NTSTATUS net_ads_join_ok ( void   )  [static]

net_ads.c879 行で定義されています。

参照先 ads_destroy()ads_ntstatus()ads_startup()net_use_krb_machine_account()secrets_init()status.

参照元 net_ads_testjoin().

00880 {
00881         ADS_STRUCT *ads = NULL;
00882         ADS_STATUS status;
00883 
00884         if (!secrets_init()) {
00885                 DEBUG(1,("Failed to initialise secrets database\n"));
00886                 return NT_STATUS_ACCESS_DENIED;
00887         }
00888 
00889         net_use_krb_machine_account();
00890 
00891         status = ads_startup(True, &ads);
00892         if (!ADS_ERR_OK(status)) {
00893                 return ads_ntstatus(status);
00894         }
00895 
00896         ads_destroy(&ads);
00897         return NT_STATUS_OK;
00898 }

int net_ads_testjoin ( int  argc,
const char **  argv 
)

net_ads.c903 行で定義されています。

参照先 fprintf()get_friendly_nt_error_msg()net_ads_join_ok()printf()statususe_in_memory_ccache().

参照元 net_ads().

00904 {
00905         NTSTATUS status;
00906         use_in_memory_ccache();
00907 
00908         /* Display success or failure */
00909         status = net_ads_join_ok();
00910         if (!NT_STATUS_IS_OK(status)) {
00911                 fprintf(stderr,"Join to domain is not valid: %s\n", 
00912                         get_friendly_nt_error_msg(status));
00913                 return -1;
00914         }
00915 
00916         printf("Join is OK\n");
00917         return 0;
00918 }

static NTSTATUS check_ads_config ( void   )  [static]

net_ads.c924 行で定義されています。

参照先 d_fprintf()d_printf()dyn_CONFIGFILEglobal_mynameROLE_DOMAIN_MEMBERSEC_ADSsecrets_init().

参照元 net_ads_join().

00925 {
00926         if (lp_server_role() != ROLE_DOMAIN_MEMBER ) {
00927                 d_printf("Host is not configured as a member server.\n");
00928                 return NT_STATUS_INVALID_DOMAIN_ROLE;
00929         }
00930 
00931         if (strlen(global_myname()) > 15) {
00932                 d_printf("Our netbios name can be at most 15 chars long, "
00933                          "\"%s\" is %u chars long\n", global_myname(),
00934                          (unsigned int)strlen(global_myname()));
00935                 return NT_STATUS_NAME_TOO_LONG;
00936         }
00937 
00938         if ( lp_security() == SEC_ADS && !*lp_realm()) {
00939                 d_fprintf(stderr, "realm must be set in in %s for ADS "
00940                         "join to succeed.\n", dyn_CONFIGFILE);
00941                 return NT_STATUS_INVALID_PARAMETER;
00942         }
00943 
00944         if (!secrets_init()) {
00945                 DEBUG(1,("Failed to initialise secrets database\n"));
00946                 /* This is a good bet for failure of secrets_init ... */
00947                 return NT_STATUS_ACCESS_DENIED;
00948         }
00949         
00950         return NT_STATUS_OK;
00951 }

static NTSTATUS net_join_domain ( TALLOC_CTX ctx,
const char *  servername,
struct in_addr *  ip,
char **  domain,
DOM_SID **  dom_sid,
const char *  password 
) [static]

net_ads.c957 行で定義されています。

参照先 clicli_shutdown()connect_to_ipc_krb5()cli_state::desthostND_TYPE_ADnetdom_get_domain_sid()netdom_join_domain()saf_store().

参照元 net_ads_join().

00961 {
00962         NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
00963         struct cli_state *cli = NULL;
00964 
00965         ret = connect_to_ipc_krb5(&cli, ip, servername);
00966         if ( !NT_STATUS_IS_OK(ret) ) {
00967                 goto done;
00968         }
00969         
00970         ret = netdom_get_domain_sid( ctx, cli, domain, dom_sid );
00971         if ( !NT_STATUS_IS_OK(ret) ) {
00972                 goto done;
00973         }
00974 
00975         /* cli->server_domain is not filled in when using krb5 
00976            session setups */
00977 
00978         saf_store( *domain, cli->desthost );
00979 
00980         ret = netdom_join_domain( ctx, cli, *dom_sid, password, ND_TYPE_AD );
00981 
00982 done:
00983         if ( cli ) 
00984                 cli_shutdown(cli);
00985 
00986         return ret;
00987 }

static ADS_STATUS net_set_machine_spn ( TALLOC_CTX ctx,
ADS_STRUCT ads_s 
) [static]

net_ads.c993 行で定義されています。

参照先 ads_count_replies()ads_find_machine_acct()ads_gen_mod()ads_get_dn()ads_init_mods()ads_memfree()ads_mod_str()ads_mod_strlist()ads_msgfree()global_mynamename_to_fqdn()statusstrlower_m()strupper_m()talloc_asprintf()talloc_strdup().

参照元 net_ads_join().

00994 {
00995         ADS_STATUS status = ADS_ERROR(LDAP_SERVER_DOWN);
00996         char *new_dn;
00997         ADS_MODLIST mods;
00998         const char *servicePrincipalName[3] = {NULL, NULL, NULL};
00999         char *psp;
01000         fstring my_fqdn;
01001         LDAPMessage *res = NULL;
01002         char *dn_string = NULL;
01003         const char *machine_name = global_myname();
01004         int count;
01005         
01006         if ( !machine_name ) {
01007                 return ADS_ERROR(LDAP_NO_MEMORY);
01008         }
01009         
01010         /* Find our DN */
01011         
01012         status = ads_find_machine_acct(ads_s, &res, machine_name);
01013         if (!ADS_ERR_OK(status)) 
01014                 return status;
01015                 
01016         if ( (count = ads_count_replies(ads_s, res)) != 1 ) {
01017                 DEBUG(1,("net_set_machine_spn: %d entries returned!\n", count));
01018                 return ADS_ERROR(LDAP_NO_MEMORY);       
01019         }
01020         
01021         if ( (dn_string = ads_get_dn(ads_s, res)) == NULL ) {
01022                 DEBUG(1, ("ads_add_machine_acct: ads_get_dn returned NULL (malloc failure?)\n"));
01023                 goto done;
01024         }
01025         
01026         new_dn = talloc_strdup(ctx, dn_string);
01027         ads_memfree(ads_s, dn_string);
01028         if (!new_dn) {
01029                 return ADS_ERROR(LDAP_NO_MEMORY);
01030         }
01031 
01032         /* Windows only creates HOST/shortname & HOST/fqdn. */
01033            
01034         if ( !(psp = talloc_asprintf(ctx, "HOST/%s", machine_name)) ) 
01035                 goto done;
01036         strupper_m(psp);
01037         servicePrincipalName[0] = psp;
01038 
01039         name_to_fqdn(my_fqdn, machine_name);
01040         strlower_m(my_fqdn);
01041         if ( !(psp = talloc_asprintf(ctx, "HOST/%s", my_fqdn)) ) 
01042                 goto done;
01043         servicePrincipalName[1] = psp;
01044         
01045         if (!(mods = ads_init_mods(ctx))) {
01046                 goto done;
01047         }
01048         
01049         /* fields of primary importance */
01050         
01051         ads_mod_str(ctx, &mods, "dNSHostName", my_fqdn);
01052         ads_mod_strlist(ctx, &mods, "servicePrincipalName", servicePrincipalName);
01053 
01054         status = ads_gen_mod(ads_s, new_dn, mods);
01055 
01056 done:
01057         ads_msgfree(ads_s, res);
01058         
01059         return status;
01060 }

static ADS_STATUS net_set_machine_upn ( TALLOC_CTX ctx,
ADS_STRUCT ads_s,
const char *  upn 
) [static]

net_ads.c1066 行で定義されています。

参照先 ads_count_replies()ads_find_machine_acct()ads_gen_mod()ads_get_dn()ads_init_mods()ads_memfree()ads_mod_str()ads_msgfree()global_mynamestatustalloc_strdup().

参照元 net_ads_join().

01067 {
01068         ADS_STATUS status = ADS_ERROR(LDAP_SERVER_DOWN);
01069         char *new_dn;
01070         ADS_MODLIST mods;
01071         LDAPMessage *res = NULL;
01072         char *dn_string = NULL;
01073         const char *machine_name = global_myname();
01074         int count;
01075         
01076         if ( !machine_name ) {
01077                 return ADS_ERROR(LDAP_NO_MEMORY);
01078         }
01079         
01080         /* Find our DN */
01081         
01082         status = ads_find_machine_acct(ads_s, &res, machine_name);
01083         if (!ADS_ERR_OK(status)) 
01084                 return status;
01085                 
01086         if ( (count = ads_count_replies(ads_s, res)) != 1 ) {
01087                 DEBUG(1,("net_set_machine_spn: %d entries returned!\n", count));
01088                 return ADS_ERROR(LDAP_NO_MEMORY);       
01089         }
01090         
01091         if ( (dn_string = ads_get_dn(ads_s, res)) == NULL ) {
01092                 DEBUG(1, ("ads_add_machine_acct: ads_get_dn returned NULL (malloc failure?)\n"));
01093                 goto done;
01094         }
01095         
01096         new_dn = talloc_strdup(ctx, dn_string);
01097         ads_memfree(ads_s, dn_string);
01098         if (!new_dn) {
01099                 return ADS_ERROR(LDAP_NO_MEMORY);
01100         }
01101         
01102         /* now do the mods */
01103         
01104         if (!(mods = ads_init_mods(ctx))) {
01105                 goto done;
01106         }
01107         
01108         /* fields of primary importance */
01109         
01110         ads_mod_str(ctx, &mods, "userPrincipalName", upn);
01111 
01112         status = ads_gen_mod(ads_s, new_dn, mods);
01113 
01114 done:
01115         ads_msgfree(ads_s, res);
01116         
01117         return status;
01118 }

static ADS_STATUS net_set_os_attributes ( TALLOC_CTX ctx,
ADS_STRUCT ads_s,
const char *  os_name,
const char *  os_version 
) [static]

net_ads.c1124 行で定義されています。

参照先 ads_count_replies()ads_find_machine_acct()ads_gen_mod()ads_get_dn()ads_init_mods()ads_memfree()ads_mod_str()ads_msgfree()global_mynamestatustalloc_asprintf()talloc_strdup().

参照元 net_ads_join().

01126 {
01127         ADS_STATUS status = ADS_ERROR(LDAP_SERVER_DOWN);
01128         char *new_dn;
01129         ADS_MODLIST mods;
01130         LDAPMessage *res = NULL;
01131         char *dn_string = NULL;
01132         const char *machine_name = global_myname();
01133         int count;
01134         char *os_sp = NULL;
01135         
01136         if ( !os_name || !os_version ) {
01137                 return ADS_ERROR(LDAP_NO_MEMORY);
01138         }
01139         
01140         /* Find our DN */
01141         
01142         status = ads_find_machine_acct(ads_s, &res, machine_name);
01143         if (!ADS_ERR_OK(status)) 
01144                 return status;
01145                 
01146         if ( (count = ads_count_replies(ads_s, res)) != 1 ) {
01147                 DEBUG(1,("net_set_machine_spn: %d entries returned!\n", count));
01148                 return ADS_ERROR(LDAP_NO_MEMORY);       
01149         }
01150         
01151         if ( (dn_string = ads_get_dn(ads_s, res)) == NULL ) {
01152                 DEBUG(1, ("ads_add_machine_acct: ads_get_dn returned NULL (malloc failure?)\n"));
01153                 goto done;
01154         }
01155         
01156         new_dn = talloc_strdup(ctx, dn_string);
01157         ads_memfree(ads_s, dn_string);
01158         if (!new_dn) {
01159                 return ADS_ERROR(LDAP_NO_MEMORY);
01160         }
01161         
01162         /* now do the mods */
01163         
01164         if (!(mods = ads_init_mods(ctx))) {
01165                 goto done;
01166         }
01167 
01168         os_sp = talloc_asprintf( ctx, "Samba %s", SAMBA_VERSION_STRING );
01169         
01170         /* fields of primary importance */
01171         
01172         ads_mod_str(ctx, &mods, "operatingSystem", os_name);
01173         ads_mod_str(ctx, &mods, "operatingSystemVersion", os_version);
01174         if ( os_sp )
01175                 ads_mod_str(ctx, &mods, "operatingSystemServicePack", os_sp);
01176 
01177         status = ads_gen_mod(ads_s, new_dn, mods);
01178 
01179 done:
01180         ads_msgfree(ads_s, res);
01181         TALLOC_FREE( os_sp );   
01182         
01183         return status;
01184 }

static ADS_STATUS net_precreate_machine_acct ( ADS_STRUCT ads,
const char *  ou 
) [static]

net_ads.c1190 行で定義されています。

参照先 ads_create_machine_acct()ads_msgfree()ads_ou_string()ads_search_dn()asprintf()ADS_STRUCT::bind_pathADS_STRUCT::configENUM_ADS_ERROR_LDAPADS_STATUS::errADS_STATUS::error_typeglobal_mynameADS_STATUS::err_state::rc.

参照元 net_ads_join().

01191 {
01192         ADS_STATUS rc = ADS_ERROR(LDAP_SERVER_DOWN);
01193         char *dn, *ou_str;
01194         LDAPMessage *res = NULL;
01195 
01196         ou_str = ads_ou_string(ads, ou);
01197         if ((asprintf(&dn, "%s,%s", ou_str, ads->config.bind_path)) == -1) {
01198                 SAFE_FREE(ou_str);
01199                 return ADS_ERROR(LDAP_NO_MEMORY);
01200         }
01201 
01202         rc = ads_search_dn(ads, &res, dn, NULL);
01203         ads_msgfree(ads, res);
01204 
01205         if (ADS_ERR_OK(rc)) {
01206                 /* Attempt to create the machine account and bail if this fails.
01207                    Assume that the admin wants exactly what they requested */
01208 
01209                 rc = ads_create_machine_acct( ads, global_myname(), dn );
01210                 if ( rc.error_type == ENUM_ADS_ERROR_LDAP && rc.err.rc == LDAP_ALREADY_EXISTS ) {
01211                         rc = ADS_SUCCESS;
01212                 }
01213         }
01214 
01215         SAFE_FREE( ou_str );
01216         SAFE_FREE( dn );
01217 
01218         return rc;
01219 }

static BOOL net_derive_salting_principal ( TALLOC_CTX ctx,
ADS_STRUCT ads 
) [static]

net_ads.c1224 行で定義されています。

参照先 ads_count_replies()ads_domain_func_level()ads_find_machine_acct()ads_msgfree()ads_pull_string()d_fprintf()global_mynamekerberos_secrets_store_des_salt()kerberos_standard_des_salt()status.

参照元 net_ads_join().

01225 {
01226         uint32 domain_func;
01227         ADS_STATUS status;
01228         fstring salt;
01229         char *std_salt;
01230         LDAPMessage *res = NULL;
01231         const char *machine_name = global_myname();
01232 
01233         status = ads_domain_func_level( ads, &domain_func );
01234         if ( !ADS_ERR_OK(status) ) {
01235                 DEBUG(2,("Failed to determine domain functional level!\n"));
01236                 return False;
01237         }
01238 
01239         /* go ahead and setup the default salt */
01240 
01241         if ( (std_salt = kerberos_standard_des_salt()) == NULL ) {
01242                 d_fprintf(stderr, "net_derive_salting_principal: failed to obtain stanard DES salt\n");
01243                 return False;
01244         }
01245 
01246         fstrcpy( salt, std_salt );
01247         SAFE_FREE( std_salt );
01248         
01249         /* if it's a Windows functional domain, we have to look for the UPN */
01250            
01251         if ( domain_func == DS_DOMAIN_FUNCTION_2000 ) { 
01252                 char *upn;
01253                 int count;
01254                 
01255                 status = ads_find_machine_acct(ads, &res, machine_name);
01256                 if (!ADS_ERR_OK(status)) {
01257                         return False;
01258                 }
01259                 
01260                 if ( (count = ads_count_replies(ads, res)) != 1 ) {
01261                         DEBUG(1,("net_set_machine_spn: %d entries returned!\n", count));
01262                         return False;
01263                 }
01264                 
01265                 upn = ads_pull_string(ads, ctx, res, "userPrincipalName");
01266                 if ( upn ) {
01267                         fstrcpy( salt, upn );
01268                 }
01269                 
01270                 ads_msgfree(ads, res);
01271         }
01272 
01273         return kerberos_secrets_store_des_salt( salt );
01274 }

DNS_ERROR DoDNSUpdate ( char *  pszServerName,
const char *  pszDomainName,
const char *  pszHostName,
const struct in_addr *  iplist,
int  num_addrs 
)

参照元 net_update_dns_internal().

static NTSTATUS net_update_dns_internal ( TALLOC_CTX ctx,
ADS_STRUCT ads,
const char *  machine_name,
const struct in_addr *  addrs,
int  num_addrs 
) [static]

net_ads.c1288 行で定義されています。

参照先 ads_build_domain()ads_connect()ads_dns_lookup_ns()ads_do_search()ads_msgfree()ads_pull_string()ADS_STRUCT::configd_printf()DoDNSUpdate()dns_rr_ns::hostnameADS_STRUCT::ldADS_STRUCT::realmstatusstrchr_m().

参照元 net_update_dns().

01292 {
01293         struct dns_rr_ns *nameservers = NULL;
01294         int ns_count = 0;
01295         NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
01296         DNS_ERROR dns_err;
01297         fstring dns_server;
01298         const char *dnsdomain = NULL;   
01299         char *root_domain = NULL;       
01300 
01301         if ( (dnsdomain = strchr_m( machine_name, '.')) == NULL ) {
01302                 d_printf("No DNS domain configured for %s. "
01303                          "Unable to perform DNS Update.\n", machine_name);
01304                 status = NT_STATUS_INVALID_PARAMETER;
01305                 goto done;
01306         }
01307         dnsdomain++;
01308 
01309         status = ads_dns_lookup_ns( ctx, dnsdomain, &nameservers, &ns_count );
01310         if ( !NT_STATUS_IS_OK(status) || (ns_count == 0)) {
01311                 /* Child domains often do not have NS records.  Look
01312                    for the NS record for the forest root domain 
01313                    (rootDomainNamingContext in therootDSE) */
01314 
01315                 const char *rootname_attrs[] =  { "rootDomainNamingContext", NULL };
01316                 LDAPMessage *msg = NULL;
01317                 char *root_dn;
01318                 ADS_STATUS ads_status;
01319                 
01320                 if ( !ads->ld ) {
01321                         ads_status = ads_connect( ads );
01322                         if ( !ADS_ERR_OK(ads_status) ) {
01323                                 DEBUG(0,("net_update_dns_internal: Failed to connect to our DC!\n"));
01324                                 goto done;                              
01325                         }                       
01326                 }
01327                 
01328                 ads_status = ads_do_search(ads, "", LDAP_SCOPE_BASE, 
01329                                        "(objectclass=*)", rootname_attrs, &msg);
01330                 if (!ADS_ERR_OK(ads_status)) {
01331                         goto done;
01332                 }
01333 
01334                 root_dn = ads_pull_string(ads, ctx, msg,  "rootDomainNamingContext");
01335                 if ( !root_dn ) {
01336                         ads_msgfree( ads, msg );                        
01337                         goto done;
01338                 }
01339 
01340                 root_domain = ads_build_domain( root_dn );
01341 
01342                 /* cleanup */
01343                 ads_msgfree( ads, msg );
01344 
01345                 /* try again for NS servers */
01346 
01347                 status = ads_dns_lookup_ns( ctx, root_domain, &nameservers, &ns_count );
01348                 
01349                 if ( !NT_STATUS_IS_OK(status) || (ns_count == 0)) {                     
01350                 DEBUG(3,("net_ads_join: Failed to find name server for the %s "
01351                          "realm\n", ads->config.realm));
01352                 goto done;
01353         }
01354 
01355                 dnsdomain = root_domain;                
01356                 
01357         }
01358 
01359         /* Now perform the dns update - we'll try non-secure and if we fail,
01360            we'll follow it up with a secure update */
01361 
01362         fstrcpy( dns_server, nameservers[0].hostname );
01363 
01364         dns_err = DoDNSUpdate(dns_server, dnsdomain, machine_name, addrs, num_addrs);
01365         if (!ERR_DNS_IS_OK(dns_err)) {
01366                 status = NT_STATUS_UNSUCCESSFUL;
01367         }
01368 
01369 done:
01370 
01371         SAFE_FREE( root_domain );
01372         
01373         return status;
01374 }

static NTSTATUS net_update_dns ( TALLOC_CTX mem_ctx,
ADS_STRUCT ads 
) [static]

net_ads.c1376 行で定義されています。

参照先 get_my_ip_address()global_mynamename_to_fqdn()net_update_dns_internal()statusstrlower_m().

参照元 net_ads_dns_register()net_ads_join().

01377 {
01378         int num_addrs;
01379         struct in_addr *iplist = NULL;
01380         fstring machine_name;
01381         NTSTATUS status;
01382 
01383         name_to_fqdn( machine_name, global_myname() );
01384         strlower_m( machine_name );
01385 
01386         /* Get our ip address (not the 127.0.0.x address but a real ip
01387          * address) */
01388 
01389         num_addrs = get_my_ip_address( &iplist );
01390         if ( num_addrs <= 0 ) {
01391                 DEBUG(4,("net_ads_join: Failed to find my non-loopback IP "
01392                          "addresses!\n"));
01393                 return NT_STATUS_INVALID_PARAMETER;
01394         }
01395 
01396         status = net_update_dns_internal(mem_ctx, ads, machine_name,
01397                                          iplist, num_addrs);
01398         SAFE_FREE( iplist );
01399         return status;
01400 }

static char* get_string_param ( const char *  param  )  [static]

net_ads.c1408 行で定義されています。

参照元 net_ads_join()net_groupmap_add()net_groupmap_delete()net_groupmap_list()net_groupmap_modify().

01409 {
01410         char *p;
01411         
01412         if ( (p = strchr( param, '=' )) == NULL )
01413                 return NULL;
01414                 
01415         return (p+1);
01416 }

static int net_ads_join_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c1421 行で定義されています。

参照先 d_printf().

参照元 net_ads_help().

01422 {
01423         d_printf("net ads join [options]\n");
01424         d_printf("Valid options:\n");
01425         d_printf("   createupn[=UPN]    Set the userPrincipalName attribute during the join.\n");
01426         d_printf("                      The deault UPN is in the form host/netbiosname@REALM.\n");
01427         d_printf("   createcomputer=OU  Precreate the computer account in a specific OU.\n");
01428         d_printf("                      The OU string read from top to bottom without RDNs and delimited by a '/'.\n");
01429         d_printf("                      E.g. \"createcomputer=Computers/Servers/Unix\"\n");
01430         d_printf("                      NB: A backslash '\\' is used as escape at multiple levels and may\n");
01431         d_printf("                          need to be doubled or even quadrupled.  It is not used as a separator");
01432 
01433         return -1;
01434 }

int net_ads_join ( int  argc,
const char **  argv 
)

net_ads.c1439 行で定義されています。

参照先 ads_destroy()ads_errstr()ads_init()ads_kdestroy()ads_keytab_create_default()ads_kinit_password()ads_ntstatus()ads_startup()asprintf()ADS_STRUCT::authcheck_ads_config()ADS_STRUCT::configctxd_fprintf()d_printf()domain_siddyn_CONFIGFILEgenerate_random_str()get_dc_name()get_friendly_nt_error_msg()get_string_param()global_mynameADS_STRUCT::ldap_ipADS_STRUCT::ldap_server_namelp_workgroup()net_ads_leave()net_derive_salting_principal()net_join_domain()net_precreate_machine_acct()net_rpc_join_ok()net_set_machine_spn()net_set_machine_upn()net_set_os_attributes()net_update_dns()netdom_store_machine_account()ADS_STRUCT::passwordpasswordADS_STRUCT::realmsecrets_fetch_machine_password()ADS_STRUCT::serversnprintf()statusstrequal()StrnCaseCmp()talloc_init()talloc_strdup()use_in_memory_ccache()ADS_STRUCT::user_name.

参照元 net_ads()net_join().

01440 {
01441         ADS_STRUCT *ads = NULL;
01442         ADS_STATUS status;
01443         NTSTATUS nt_status;
01444         char *machine_account = NULL;
01445         char *short_domain_name = NULL;
01446         char *tmp_password, *password;
01447         TALLOC_CTX *ctx = NULL;
01448         DOM_SID *domain_sid = NULL;
01449         BOOL createupn = False;
01450         const char *machineupn = NULL;
01451         const char *create_in_ou = NULL;
01452         int i;
01453         fstring dc_name;
01454         struct in_addr dcip;
01455         const char *os_name = NULL;
01456         const char *os_version = NULL;
01457         
01458         nt_status = check_ads_config();
01459         if (!NT_STATUS_IS_OK(nt_status)) {
01460                 d_fprintf(stderr, "Invalid configuration.  Exiting....\n");
01461                 goto fail;
01462         }
01463 
01464         /* find a DC to initialize the server affinity cache */
01465 
01466         get_dc_name( lp_workgroup(), lp_realm(), dc_name, &dcip );
01467 
01468         status = ads_startup(True, &ads);
01469         if (!ADS_ERR_OK(status)) {
01470                 DEBUG(1, ("error on ads_startup: %s\n", ads_errstr(status)));
01471                 nt_status = ads_ntstatus(status);
01472                 goto fail;
01473         }
01474 
01475         if (strcmp(ads->config.realm, lp_realm()) != 0) {
01476                 d_fprintf(stderr, "realm of remote server (%s) and realm in %s "
01477                         "(%s) DO NOT match.  Aborting join\n", ads->config.realm, 
01478                         dyn_CONFIGFILE, lp_realm());
01479                 nt_status = NT_STATUS_INVALID_PARAMETER;
01480                 goto fail;
01481         }
01482 
01483         if (!(ctx = talloc_init("net_ads_join"))) {
01484                 d_fprintf(stderr, "Could not initialise talloc context.\n");
01485                 nt_status = NT_STATUS_NO_MEMORY;
01486                 goto fail;
01487         }
01488 
01489         /* process additional command line args */
01490         
01491         for ( i=0; i<argc; i++ ) {
01492                 if ( !StrnCaseCmp(argv[i], "createupn", strlen("createupn")) ) {
01493                         createupn = True;
01494                         machineupn = get_string_param(argv[i]);
01495                 }
01496                 else if ( !StrnCaseCmp(argv[i], "createcomputer", strlen("createcomputer")) ) {
01497                         if ( (create_in_ou = get_string_param(argv[i])) == NULL ) {
01498                                 d_fprintf(stderr, "Please supply a valid OU path.\n");
01499                                 nt_status = NT_STATUS_INVALID_PARAMETER;
01500                                 goto fail;
01501                         }               
01502                 }
01503                 else if ( !StrnCaseCmp(argv[i], "osName", strlen("osName")) ) {
01504                         if ( (os_name = get_string_param(argv[i])) == NULL ) {
01505                                 d_fprintf(stderr, "Please supply a operating system name.\n");
01506                                 nt_status = NT_STATUS_INVALID_PARAMETER;
01507                                 goto fail;
01508                         }               
01509                 }
01510                 else if ( !StrnCaseCmp(argv[i], "osVer", strlen("osVer")) ) {
01511                         if ( (os_version = get_string_param(argv[i])) == NULL ) {
01512                                 d_fprintf(stderr, "Please supply a valid operating system version.\n");
01513                                 nt_status = NT_STATUS_INVALID_PARAMETER;
01514                                 goto fail;
01515                         }               
01516                 }
01517                 else {
01518                         d_fprintf(stderr, "Bad option: %s\n", argv[i]);
01519                         nt_status = NT_STATUS_INVALID_PARAMETER;
01520                         goto fail;
01521                 }
01522         }
01523 
01524         /* If we were given an OU, try to create the machine in 
01525            the OU account first and then do the normal RPC join */
01526 
01527         if  ( create_in_ou ) {
01528                 status = net_precreate_machine_acct( ads, create_in_ou );
01529                 if ( !ADS_ERR_OK(status) ) {
01530                         d_fprintf( stderr, "Failed to pre-create the machine object "
01531                                 "in OU %s.\n", argv[0]);
01532                         DEBUG(1, ("error calling net_precreate_machine_acct: %s\n", 
01533                                   ads_errstr(status)));
01534                         nt_status = ads_ntstatus(status);
01535                         goto fail;
01536                 }
01537         }
01538 
01539         /* Do the domain join here */
01540 
01541         tmp_password = generate_random_str(DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH);
01542         password = talloc_strdup(ctx, tmp_password);
01543         
01544         nt_status = net_join_domain(ctx, ads->config.ldap_server_name, 
01545                                     &ads->ldap_ip, &short_domain_name, &domain_sid, password);
01546         if ( !NT_STATUS_IS_OK(nt_status) ) {
01547                 DEBUG(1, ("call of net_join_domain failed: %s\n", 
01548                           get_friendly_nt_error_msg(nt_status)));
01549                 goto fail;
01550         }
01551 
01552         /* Check the short name of the domain */
01553         
01554         if ( !strequal(lp_workgroup(), short_domain_name) ) {
01555                 d_printf("The workgroup in %s does not match the short\n", dyn_CONFIGFILE);
01556                 d_printf("domain name obtained from the server.\n");
01557                 d_printf("Using the name [%s] from the server.\n", short_domain_name);
01558                 d_printf("You should set \"workgroup = %s\" in %s.\n", 
01559                          short_domain_name, dyn_CONFIGFILE);
01560         }
01561         
01562         d_printf("Using short domain name -- %s\n", short_domain_name);
01563 
01564         /*  HACK ALERT!  Store the sid and password under both the lp_workgroup() 
01565             value from smb.conf and the string returned from the server.  The former is
01566             neede to bootstrap winbindd's first connection to the DC to get the real 
01567             short domain name   --jerry */
01568            
01569         if ( (netdom_store_machine_account( lp_workgroup(), domain_sid, password ) == -1)
01570                 || (netdom_store_machine_account( short_domain_name, domain_sid, password ) == -1) )
01571         {
01572                 /* issue an internal error here for now.
01573                  * everything else would mean changing tdb routines. */
01574                 nt_status = NT_STATUS_INTERNAL_ERROR;
01575                 goto fail;
01576         }
01577 
01578         /* Verify that everything is ok */
01579 
01580         if ( net_rpc_join_ok(short_domain_name, ads->config.ldap_server_name, &ads->ldap_ip) != 0 ) {
01581                 d_fprintf(stderr, "Failed to verify membership in domain!\n");
01582                 goto fail;
01583         }       
01584 
01585         /* create the dNSHostName & servicePrincipalName values */
01586         
01587         status = net_set_machine_spn( ctx, ads );
01588         if ( !ADS_ERR_OK(status) )  {
01589 
01590                 d_fprintf(stderr, "Failed to set servicePrincipalNames. Please ensure that\n");
01591                 d_fprintf(stderr, "the DNS domain of this server matches the AD domain,\n");
01592                 d_fprintf(stderr, "Or rejoin with using Domain Admin credentials.\n");
01593                 
01594                 /* Disable the machine account in AD.  Better to fail than to leave 
01595                    a confused admin.  */
01596                 
01597                 if ( net_ads_leave( 0, NULL ) != 0 ) {
01598                         d_fprintf( stderr, "Failed to disable machine account in AD.  Please do so manually.\n");
01599                 }
01600                 
01601                 /* clear out the machine password */
01602                 
01603                 netdom_store_machine_account( lp_workgroup(), domain_sid, "" ); 
01604                 netdom_store_machine_account( short_domain_name, domain_sid, "" );
01605                 
01606                 nt_status = ads_ntstatus(status);
01607                 goto fail;
01608         }
01609 
01610         if ( !net_derive_salting_principal( ctx, ads ) ) {
01611                 DEBUG(1,("Failed to determine salting principal\n"));
01612                 goto fail;
01613         }
01614 
01615         if ( createupn ) {
01616                 pstring upn;
01617                 
01618                 /* default to using the short UPN name */
01619                 if ( !machineupn ) {
01620                         snprintf( upn, sizeof(upn), "host/%s@%s", global_myname(), 
01621                                 ads->config.realm );
01622                         machineupn = upn;
01623                 }
01624                 
01625                 status = net_set_machine_upn( ctx, ads, machineupn );
01626                 if ( !ADS_ERR_OK(status) )  {
01627                         d_fprintf(stderr, "Failed to set userPrincipalName.  Are you a Domain Admin?\n");
01628                 }
01629         }
01630 
01631         /* Try to set the operatingSystem attributes if asked */
01632 
01633         if ( os_name && os_version ) {
01634                 status = net_set_os_attributes( ctx, ads, os_name, os_version );
01635                 if ( !ADS_ERR_OK(status) )  {
01636                         d_fprintf(stderr, "Failed to set operatingSystem attributes.  "
01637                                   "Are you a Domain Admin?\n");
01638                 }
01639         }
01640 
01641         /* Now build the keytab, using the same ADS connection */
01642 
01643         if (lp_use_kerberos_keytab() && ads_keytab_create_default(ads)) {
01644                 DEBUG(1,("Error creating host keytab!\n"));
01645         }
01646 
01647 #if defined(WITH_DNS_UPDATES)
01648         /* We enter this block with user creds */
01649         ads_kdestroy( NULL );   
01650         ads_destroy(&ads);
01651         ads = NULL;
01652         
01653         if ( (ads = ads_init( lp_realm(), NULL, NULL )) != NULL ) {
01654                 /* kinit with the machine password */
01655 
01656                 use_in_memory_ccache();
01657                 asprintf( &ads->auth.user_name, "%s$", global_myname() );
01658                 ads->auth.password = secrets_fetch_machine_password(
01659                         lp_workgroup(), NULL, NULL );
01660                 ads->auth.realm = SMB_STRDUP( lp_realm() );
01661                 ads_kinit_password( ads );
01662         }
01663         
01664         if ( !ads || !NT_STATUS_IS_OK(net_update_dns( ctx, ads )) ) {
01665                 d_fprintf( stderr, "DNS update failed!\n" );
01666         }
01667         
01668         /* exit from this block using machine creds */
01669 #endif
01670 
01671         d_printf("Joined '%s' to realm '%s'\n", global_myname(), ads->server.realm);
01672 
01673         SAFE_FREE(machine_account);
01674         TALLOC_FREE( ctx );
01675         ads_destroy(&ads);
01676         
01677         return 0;
01678 
01679 fail:
01680         /* issue an overall failure message at the end. */
01681         d_printf("Failed to join domain: %s\n", get_friendly_nt_error_msg(nt_status));
01682 
01683         SAFE_FREE(machine_account);
01684         TALLOC_FREE( ctx );
01685         ads_destroy(&ads);
01686 
01687         return -1;
01688 
01689 }

static int net_ads_dns_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c1694 行で定義されています。

参照先 d_fprintf()d_printf().

参照元 net_ads_dns()net_ads_help().

01695 {
01696 #if defined(WITH_DNS_UPDATES)
01697         d_printf("net ads dns <command>\n");
01698         d_printf("Valid commands:\n");
01699         d_printf("   register         Issue a dynamic DNS update request for our hostname\n");
01700 
01701         return 0;
01702 #else
01703         d_fprintf(stderr, "DNS update support not enabled at compile time!\n");
01704         return -1;
01705 #endif
01706 }

static int net_ads_dns_register ( int  argc,
const char **  argv 
) [static]

net_ads.c1711 行で定義されています。

参照先 ads_destroy()ads_errstr()ads_startup()ctxd_fprintf()net_update_dns()statustalloc_enable_leak_report()talloc_init().

参照元 net_ads_dns().

01712 {
01713 #if defined(WITH_DNS_UPDATES)
01714         ADS_STRUCT *ads;
01715         ADS_STATUS status;
01716         TALLOC_CTX *ctx;
01717         
01718 #ifdef DEVELOPER
01719         talloc_enable_leak_report();
01720 #endif
01721         
01722         if (argc > 0) {
01723                 d_fprintf(stderr, "net ads dns register\n");
01724                 return -1;
01725         }
01726 
01727         if (!(ctx = talloc_init("net_ads_dns"))) {
01728                 d_fprintf(stderr, "Could not initialise talloc context\n");
01729                 return -1;
01730         }
01731 
01732         status = ads_startup(True, &ads);
01733         if ( !ADS_ERR_OK(status) ) {
01734                 DEBUG(1, ("error on ads_startup: %s\n", ads_errstr(status)));
01735                 TALLOC_FREE(ctx);
01736                 return -1;
01737         }
01738 
01739         if ( !NT_STATUS_IS_OK(net_update_dns(ctx, ads)) ) {             
01740                 d_fprintf( stderr, "DNS update failed!\n" );
01741                 ads_destroy( &ads );
01742                 TALLOC_FREE( ctx );
01743                 return -1;
01744         }
01745         
01746         d_fprintf( stderr, "Successfully registered hostname with DNS\n" );
01747 
01748         ads_destroy(&ads);
01749         TALLOC_FREE( ctx );
01750         
01751         return 0;
01752 #else
01753         d_fprintf(stderr, "DNS update support not enabled at compile time!\n");
01754         return -1;
01755 #endif
01756 }

DNS_ERROR do_gethostbyname ( const char *  server,
const char *  host 
)

net_dns.c163 行で定義されています。

参照先 dns_create_query()dns_open_connection()dns_transaction()errerror.

参照元 net_ads_dns_gethostbyname().

00164 {
00165         struct dns_connection *conn;
00166         struct dns_request *req, *resp;
00167         DNS_ERROR err;
00168 
00169         err = dns_open_connection(server, DNS_UDP, NULL, &conn);
00170         if (!ERR_DNS_IS_OK(err)) goto error;
00171 
00172         err = dns_create_query(conn, host, QTYPE_A, DNS_CLASS_IN, &req);
00173         if (!ERR_DNS_IS_OK(err)) goto error;
00174 
00175         err = dns_transaction(conn, conn, req, &resp);
00176 
00177  error:
00178         TALLOC_FREE(conn);
00179         return err;
00180 }

static int net_ads_dns_gethostbyname ( int  argc,
const char **  argv 
) [static]

net_ads.c1762 行で定義されています。

参照先 d_fprintf()d_printf()do_gethostbyname()errtalloc_enable_leak_report().

参照元 net_ads_dns().

01763 {
01764 #if defined(WITH_DNS_UPDATES)
01765         DNS_ERROR err;
01766         
01767 #ifdef DEVELOPER
01768         talloc_enable_leak_report();
01769 #endif
01770 
01771         if (argc != 2) {
01772                 d_fprintf(stderr, "net ads dns gethostbyname <server> "
01773                           "<name>\n");
01774                 return -1;
01775         }
01776 
01777         err = do_gethostbyname(argv[0], argv[1]);
01778 
01779         d_printf("do_gethostbyname returned %d\n", ERROR_DNS_V(err));
01780 #endif
01781         return 0;
01782 }

static int net_ads_dns ( int  argc,
const char *  argv[] 
) [static]

net_ads.c1784 行で定義されています。

参照先 net_ads_dns_gethostbyname()net_ads_dns_register()net_ads_dns_usage()net_run_function().

参照元 net_ads().

01785 {
01786         struct functable func[] = {
01787                 {"REGISTER", net_ads_dns_register},
01788                 {"GETHOSTBYNAME", net_ads_dns_gethostbyname},
01789                 {NULL, NULL}
01790         };
01791 
01792         return net_run_function(argc, argv, func, net_ads_dns_usage);
01793 }

int net_ads_printer_usage ( int  argc,
const char **  argv 
)

net_ads.c1798 行で定義されています。

参照先 d_printf().

参照元 net_ads_help()net_ads_printer()net_ads_printer_publish()net_ads_printer_remove().

01799 {
01800         d_printf(
01801 "\nnet ads printer search <printer>"
01802 "\n\tsearch for a printer in the directory\n"
01803 "\nnet ads printer info <printer> <server>"
01804 "\n\tlookup info in directory for printer on server"
01805 "\n\t(note: printer defaults to \"*\", server defaults to local)\n"
01806 "\nnet ads printer publish <printername>"
01807 "\n\tpublish printer in directory"
01808 "\n\t(note: printer name is required)\n"
01809 "\nnet ads printer remove <printername>"
01810 "\n\tremove printer from directory"
01811 "\n\t(note: printer name is required)\n");
01812         return -1;
01813 }

static int net_ads_printer_search ( int  argc,
const char **  argv 
) [static]

net_ads.c1818 行で定義されています。

参照先 ads_count_replies()ads_destroy()ads_dump()ads_errstr()ads_find_printers()ads_msgfree()ads_startup()d_fprintf().

参照元 net_ads_printer().

01819 {
01820         ADS_STRUCT *ads;
01821         ADS_STATUS rc;
01822         LDAPMessage *res = NULL;
01823 
01824         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
01825                 return -1;
01826         }
01827 
01828         rc = ads_find_printers(ads, &res);
01829 
01830         if (!ADS_ERR_OK(rc)) {
01831                 d_fprintf(stderr, "ads_find_printer: %s\n", ads_errstr(rc));
01832                 ads_msgfree(ads, res);
01833                 ads_destroy(&ads);
01834                 return -1;
01835         }
01836 
01837         if (ads_count_replies(ads, res) == 0) {
01838                 d_fprintf(stderr, "No results found\n");
01839                 ads_msgfree(ads, res);
01840                 ads_destroy(&ads);
01841                 return -1;
01842         }
01843 
01844         ads_dump(ads, res);
01845         ads_msgfree(ads, res);
01846         ads_destroy(&ads);
01847         return 0;
01848 }

static int net_ads_printer_info ( int  argc,
const char **  argv 
) [static]

net_ads.c1850 行で定義されています。

参照先 ads_count_replies()ads_destroy()ads_dump()ads_errstr()ads_find_printer_on_server()ads_msgfree()ads_startup()d_fprintf()global_myname.

参照元 net_ads_printer().

01851 {
01852         ADS_STRUCT *ads;
01853         ADS_STATUS rc;
01854         const char *servername, *printername;
01855         LDAPMessage *res = NULL;
01856 
01857         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
01858                 return -1;
01859         }
01860 
01861         if (argc > 0) {
01862                 printername = argv[0];
01863         } else {
01864                 printername = "*";
01865         }
01866 
01867         if (argc > 1) {
01868                 servername =  argv[1];
01869         } else {
01870                 servername = global_myname();
01871         }
01872 
01873         rc = ads_find_printer_on_server(ads, &res, printername, servername);
01874 
01875         if (!ADS_ERR_OK(rc)) {
01876                 d_fprintf(stderr, "Server '%s' not found: %s\n", 
01877                         servername, ads_errstr(rc));
01878                 ads_msgfree(ads, res);
01879                 ads_destroy(&ads);
01880                 return -1;
01881         }
01882 
01883         if (ads_count_replies(ads, res) == 0) {
01884                 d_fprintf(stderr, "Printer '%s' not found\n", printername);
01885                 ads_msgfree(ads, res);
01886                 ads_destroy(&ads);
01887                 return -1;
01888         }
01889 
01890         ads_dump(ads, res);
01891         ads_msgfree(ads, res);
01892         ads_destroy(&ads);
01893 
01894         return 0;
01895 }

void do_drv_upgrade_printer ( int  msg_type,
struct process_id  src,
void *  buf,
size_t  len,
void *  private_data 
)

net_ads.c1897 行で定義されています。

01899 {
01900         return;
01901 }

static int net_ads_printer_publish ( int  argc,
const char **  argv 
) [static]

net_ads.c1903 行で定義されています。

参照先 ads_add_printer_entry()ads_count_replies()ads_destroy()ads_errstr()ads_find_machine_acct()ads_init_mods()ads_startup()asprintf()clicli_full_connection()cli_rpc_pipe_open_noauth()d_fprintf()d_printf()escape_rdn_val_string_alloc()get_remote_printer_publishing_data()global_mynameADS_STRUCT::ldnet_ads_printer_usage()opt_passwordopt_user_nameopt_workgroupresolve_name()talloc_init().

参照元 net_ads_printer().

01904 {
01905         ADS_STRUCT *ads;
01906         ADS_STATUS rc;
01907         const char *servername, *printername;
01908         struct cli_state *cli;
01909         struct rpc_pipe_client *pipe_hnd;
01910         struct in_addr          server_ip;
01911         NTSTATUS nt_status;
01912         TALLOC_CTX *mem_ctx = talloc_init("net_ads_printer_publish");
01913         ADS_MODLIST mods = ads_init_mods(mem_ctx);
01914         char *prt_dn, *srv_dn, **srv_cn;
01915         char *srv_cn_escaped = NULL, *printername_escaped = NULL;
01916         LDAPMessage *res = NULL;
01917 
01918         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
01919                 talloc_destroy(mem_ctx);
01920                 return -1;
01921         }
01922 
01923         if (argc < 1) {
01924                 talloc_destroy(mem_ctx);
01925                 return net_ads_printer_usage(argc, argv);
01926         }
01927         
01928         printername = argv[0];
01929 
01930         if (argc == 2) {
01931                 servername = argv[1];
01932         } else {
01933                 servername = global_myname();
01934         }
01935                 
01936         /* Get printer data from SPOOLSS */
01937 
01938         resolve_name(servername, &server_ip, 0x20);
01939 
01940         nt_status = cli_full_connection(&cli, global_myname(), servername, 
01941                                         &server_ip, 0,
01942                                         "IPC$", "IPC",  
01943                                         opt_user_name, opt_workgroup,
01944                                         opt_password ? opt_password : "", 
01945                                         CLI_FULL_CONNECTION_USE_KERBEROS, 
01946                                         Undefined, NULL);
01947 
01948         if (NT_STATUS_IS_ERR(nt_status)) {
01949                 d_fprintf(stderr, "Unable to open a connnection to %s to obtain data "
01950                          "for %s\n", servername, printername);
01951                 ads_destroy(&ads);
01952                 talloc_destroy(mem_ctx);
01953                 return -1;
01954         }
01955 
01956         /* Publish on AD server */
01957 
01958         ads_find_machine_acct(ads, &res, servername);
01959 
01960         if (ads_count_replies(ads, res) == 0) {
01961                 d_fprintf(stderr, "Could not find machine account for server %s\n", 
01962                          servername);
01963                 ads_destroy(&ads);
01964                 talloc_destroy(mem_ctx);
01965                 return -1;
01966         }
01967 
01968         srv_dn = ldap_get_dn((LDAP *)ads->ld, (LDAPMessage *)res);
01969         srv_cn = ldap_explode_dn(srv_dn, 1);
01970 
01971         srv_cn_escaped = escape_rdn_val_string_alloc(srv_cn[0]);
01972         printername_escaped = escape_rdn_val_string_alloc(printername);
01973         if (!srv_cn_escaped || !printername_escaped) {
01974                 SAFE_FREE(srv_cn_escaped);
01975                 SAFE_FREE(printername_escaped);
01976                 d_fprintf(stderr, "Internal error, out of memory!");
01977                 ads_destroy(&ads);
01978                 talloc_destroy(mem_ctx);
01979                 return -1;
01980         }
01981 
01982         asprintf(&prt_dn, "cn=%s-%s,%s", srv_cn_escaped, printername_escaped, srv_dn);
01983 
01984         SAFE_FREE(srv_cn_escaped);
01985         SAFE_FREE(printername_escaped);
01986 
01987         pipe_hnd = cli_rpc_pipe_open_noauth(cli, PI_SPOOLSS, &nt_status);
01988         if (!pipe_hnd) {
01989                 d_fprintf(stderr, "Unable to open a connnection to the spoolss pipe on %s\n",
01990                          servername);
01991                 SAFE_FREE(prt_dn);
01992                 ads_destroy(&ads);
01993                 talloc_destroy(mem_ctx);
01994                 return -1;
01995         }
01996 
01997         if (!W_ERROR_IS_OK(get_remote_printer_publishing_data(pipe_hnd, mem_ctx, &mods,
01998                                                               printername))) {
01999                 SAFE_FREE(prt_dn);
02000                 ads_destroy(&ads);
02001                 talloc_destroy(mem_ctx);
02002                 return -1;
02003         }
02004 
02005         rc = ads_add_printer_entry(ads, prt_dn, mem_ctx, &mods);
02006         if (!ADS_ERR_OK(rc)) {
02007                 d_fprintf(stderr, "ads_publish_printer: %s\n", ads_errstr(rc));
02008                 SAFE_FREE(prt_dn);
02009                 ads_destroy(&ads);
02010                 talloc_destroy(mem_ctx);
02011                 return -1;
02012         }
02013  
02014         d_printf("published printer\n");
02015         SAFE_FREE(prt_dn);
02016         ads_destroy(&ads);
02017         talloc_destroy(mem_ctx);
02018  
02019         return 0;
02020 }

static int net_ads_printer_remove ( int  argc,
const char **  argv 
) [static]

net_ads.c2022 行で定義されています。

参照先 ads_count_replies()ads_del_dn()ads_destroy()ads_errstr()ads_find_printer_on_server()ads_get_dn()ads_memfree()ads_msgfree()ads_startup()d_fprintf()global_mynamenet_ads_printer_usage().

参照元 net_ads_printer().

02023 {
02024         ADS_STRUCT *ads;
02025         ADS_STATUS rc;
02026         const char *servername;
02027         char *prt_dn;
02028         LDAPMessage *res = NULL;
02029 
02030         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
02031                 return -1;
02032         }
02033 
02034         if (argc < 1) {
02035                 return net_ads_printer_usage(argc, argv);
02036         }
02037 
02038         if (argc > 1) {
02039                 servername = argv[1];
02040         } else {
02041                 servername = global_myname();
02042         }
02043 
02044         rc = ads_find_printer_on_server(ads, &res, argv[0], servername);
02045 
02046         if (!ADS_ERR_OK(rc)) {
02047                 d_fprintf(stderr, "ads_find_printer_on_server: %s\n", ads_errstr(rc));
02048                 ads_msgfree(ads, res);
02049                 ads_destroy(&ads);
02050                 return -1;
02051         }
02052 
02053         if (ads_count_replies(ads, res) == 0) {
02054                 d_fprintf(stderr, "Printer '%s' not found\n", argv[1]);
02055                 ads_msgfree(ads, res);
02056                 ads_destroy(&ads);
02057                 return -1;
02058         }
02059 
02060         prt_dn = ads_get_dn(ads, res);
02061         ads_msgfree(ads, res);
02062         rc = ads_del_dn(ads, prt_dn);
02063         ads_memfree(ads, prt_dn);
02064 
02065         if (!ADS_ERR_OK(rc)) {
02066                 d_fprintf(stderr, "ads_del_dn: %s\n", ads_errstr(rc));
02067                 ads_destroy(&ads);
02068                 return -1;
02069         }
02070 
02071         ads_destroy(&ads);
02072         return 0;
02073 }

static int net_ads_printer ( int  argc,
const char **  argv 
) [static]

net_ads.c2075 行で定義されています。

参照先 net_ads_printer_info()net_ads_printer_publish()net_ads_printer_remove()net_ads_printer_search()net_ads_printer_usage()net_run_function().

参照元 net_ads().

02076 {
02077         struct functable func[] = {
02078                 {"SEARCH", net_ads_printer_search},
02079                 {"INFO", net_ads_printer_info},
02080                 {"PUBLISH", net_ads_printer_publish},
02081                 {"REMOVE", net_ads_printer_remove},
02082                 {NULL, NULL}
02083         };
02084         
02085         return net_run_function(argc, argv, func, net_ads_printer_usage);
02086 }

static int net_ads_password ( int  argc,
const char **  argv 
) [static]

net_ads.c2089 行で定義されています。

参照先 ads_connect()ads_destroy()ads_errstr()ads_init()asprintf()ADS_STRUCT::authcADS_STRUCT::configd_fprintf()d_printf()ADS_STRUCT::kdc_serverkerberos_set_password()opt_hostopt_passwordopt_user_nameopt_workgrouppromptADS_STRUCT::realmstrchr_m()ADS_STRUCT::time_offsetuse_in_memory_ccache().

参照元 net_ads()net_ads_help().

02090 {
02091         ADS_STRUCT *ads;
02092         const char *auth_principal = opt_user_name;
02093         const char *auth_password = opt_password;
02094         char *realm = NULL;
02095         char *new_password = NULL;
02096         char *c, *prompt;
02097         const char *user;
02098         ADS_STATUS ret;
02099 
02100         if (opt_user_name == NULL || opt_password == NULL) {
02101                 d_fprintf(stderr, "You must supply an administrator username/password\n");
02102                 return -1;
02103         }
02104 
02105         if (argc < 1) {
02106                 d_fprintf(stderr, "ERROR: You must say which username to change password for\n");
02107                 return -1;
02108         }
02109 
02110         user = argv[0];
02111         if (!strchr_m(user, '@')) {
02112                 asprintf(&c, "%s@%s", argv[0], lp_realm());
02113                 user = c;
02114         }
02115 
02116         use_in_memory_ccache();    
02117         c = strchr_m(auth_principal, '@');
02118         if (c) {
02119                 realm = ++c;
02120         } else {
02121                 realm = lp_realm();
02122         }
02123 
02124         /* use the realm so we can eventually change passwords for users 
02125         in realms other than default */
02126         if (!(ads = ads_init(realm, opt_workgroup, opt_host))) {
02127                 return -1;
02128         }
02129 
02130         /* we don't actually need a full connect, but it's the easy way to
02131                 fill in the KDC's addresss */
02132         ads_connect(ads);
02133     
02134         if (!ads || !ads->config.realm) {
02135                 d_fprintf(stderr, "Didn't find the kerberos server!\n");
02136                 return -1;
02137         }
02138 
02139         if (argv[1]) {
02140                 new_password = (char *)argv[1];
02141         } else {
02142                 asprintf(&prompt, "Enter new password for %s:", user);
02143                 new_password = getpass(prompt);
02144                 free(prompt);
02145         }
02146 
02147         ret = kerberos_set_password(ads->auth.kdc_server, auth_principal, 
02148                                 auth_password, user, new_password, ads->auth.time_offset);
02149         if (!ADS_ERR_OK(ret)) {
02150                 d_fprintf(stderr, "Password change failed: %s\n", ads_errstr(ret));
02151                 ads_destroy(&ads);
02152                 return -1;
02153         }
02154 
02155         d_printf("Password change for %s completed.\n", user);
02156         ads_destroy(&ads);
02157 
02158         return 0;
02159 }

int net_ads_changetrustpw ( int  argc,
const char **  argv 
)

net_ads.c2161 行で定義されています。

参照先 ads_change_trust_account_password()ads_destroy()ads_errstr()ads_keytab_create_default()ads_startup()asprintf()ADS_STRUCT::configd_fprintf()d_printf()global_mynamenet_use_krb_machine_account()ADS_STRUCT::realmsecrets_init()strlower_m()use_in_memory_ccache().

参照元 net_ads()net_ads_help()net_changetrustpw().

02162 {    
02163         ADS_STRUCT *ads;
02164         char *host_principal;
02165         fstring my_name;
02166         ADS_STATUS ret;
02167 
02168         if (!secrets_init()) {
02169                 DEBUG(1,("Failed to initialise secrets database\n"));
02170                 return -1;
02171         }
02172 
02173         net_use_krb_machine_account();
02174 
02175         use_in_memory_ccache();
02176 
02177         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
02178                 return -1;
02179         }
02180 
02181         fstrcpy(my_name, global_myname());
02182         strlower_m(my_name);
02183         asprintf(&host_principal, "%s$@%s", my_name, ads->config.realm);
02184         d_printf("Changing password for principal: %s\n", host_principal);
02185 
02186         ret = ads_change_trust_account_password(ads, host_principal);
02187 
02188         if (!ADS_ERR_OK(ret)) {
02189                 d_fprintf(stderr, "Password change failed: %s\n", ads_errstr(ret));
02190                 ads_destroy(&ads);
02191                 SAFE_FREE(host_principal);
02192                 return -1;
02193         }
02194     
02195         d_printf("Password change for principal %s succeeded.\n", host_principal);
02196 
02197         if (lp_use_kerberos_keytab()) {
02198                 d_printf("Attempting to update system keytab with new password.\n");
02199                 if (ads_keytab_create_default(ads)) {
02200                         d_printf("Failed to update system keytab.\n");
02201                 }
02202         }
02203 
02204         ads_destroy(&ads);
02205         SAFE_FREE(host_principal);
02206 
02207         return 0;
02208 }

static int net_ads_search_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c2213 行で定義されています。

参照先 d_printf()net_common_flags_usage().

参照元 net_ads_help()net_ads_search().

02214 {
02215         d_printf(
02216                 "\nnet ads search <expression> <attributes...>\n"\
02217                 "\nperform a raw LDAP search on a ADS server and dump the results\n"\
02218                 "The expression is a standard LDAP search expression, and the\n"\
02219                 "attributes are a list of LDAP fields to show in the results\n\n"\
02220                 "Example: net ads search '(objectCategory=group)' sAMAccountName\n\n"
02221                 );
02222         net_common_flags_usage(argc, argv);
02223         return -1;
02224 }

static int net_ads_search ( int  argc,
const char **  argv 
) [static]

net_ads.c2230 行で定義されています。

参照先 ads_count_replies()ads_destroy()ads_do_search_all()ads_dump()ads_errstr()ads_msgfree()ads_startup()ADS_STRUCT::bind_pathADS_STRUCT::configd_fprintf()d_printf()net_ads_search_usage().

参照元 net_ads().

02231 {
02232         ADS_STRUCT *ads;
02233         ADS_STATUS rc;
02234         const char *ldap_exp;
02235         const char **attrs;
02236         LDAPMessage *res = NULL;
02237 
02238         if (argc < 1) {
02239                 return net_ads_search_usage(argc, argv);
02240         }
02241 
02242         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
02243                 return -1;
02244         }
02245 
02246         ldap_exp = argv[0];
02247         attrs = (argv + 1);
02248 
02249         rc = ads_do_search_all(ads, ads->config.bind_path,
02250                                LDAP_SCOPE_SUBTREE,
02251                                ldap_exp, attrs, &res);
02252         if (!ADS_ERR_OK(rc)) {
02253                 d_fprintf(stderr, "search failed: %s\n", ads_errstr(rc));
02254                 ads_destroy(&ads);
02255                 return -1;
02256         }       
02257 
02258         d_printf("Got %d replies\n\n", ads_count_replies(ads, res));
02259 
02260         /* dump the results */
02261         ads_dump(ads, res);
02262 
02263         ads_msgfree(ads, res);
02264         ads_destroy(&ads);
02265 
02266         return 0;
02267 }

static int net_ads_dn_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c2273 行で定義されています。

参照先 d_printf()net_common_flags_usage().

参照元 net_ads_dn().

02274 {
02275         d_printf(
02276                 "\nnet ads dn <dn> <attributes...>\n"\
02277                 "\nperform a raw LDAP search on a ADS server and dump the results\n"\
02278                 "The DN standard LDAP DN, and the attributes are a list of LDAP fields \n"\
02279                 "to show in the results\n\n"\
02280                 "Example: net ads dn 'CN=administrator,CN=Users,DC=my,DC=domain' sAMAccountName\n\n"
02281                 "Note: the DN must be provided properly escaped. See RFC 4514 for details\n\n"
02282                 );
02283         net_common_flags_usage(argc, argv);
02284         return -1;
02285 }

static int net_ads_dn ( int  argc,
const char **  argv 
) [static]

net_ads.c2291 行で定義されています。

参照先 ads_count_replies()ads_destroy()ads_do_search_all()ads_dump()ads_errstr()ads_msgfree()ads_startup()d_fprintf()d_printf()net_ads_dn_usage().

参照元 net_ads().

02292 {
02293         ADS_STRUCT *ads;
02294         ADS_STATUS rc;
02295         const char *dn;
02296         const char **attrs;
02297         LDAPMessage *res = NULL;
02298 
02299         if (argc < 1) {
02300                 return net_ads_dn_usage(argc, argv);
02301         }
02302 
02303         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
02304                 return -1;
02305         }
02306 
02307         dn = argv[0];
02308         attrs = (argv + 1);
02309 
02310         rc = ads_do_search_all(ads, dn, 
02311                                LDAP_SCOPE_BASE,
02312                                "(objectclass=*)", attrs, &res);
02313         if (!ADS_ERR_OK(rc)) {
02314                 d_fprintf(stderr, "search failed: %s\n", ads_errstr(rc));
02315                 ads_destroy(&ads);
02316                 return -1;
02317         }       
02318 
02319         d_printf("Got %d replies\n\n", ads_count_replies(ads, res));
02320 
02321         /* dump the results */
02322         ads_dump(ads, res);
02323 
02324         ads_msgfree(ads, res);
02325         ads_destroy(&ads);
02326 
02327         return 0;
02328 }

static int net_ads_sid_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c2333 行で定義されています。

参照先 d_printf()net_common_flags_usage().

参照元 net_ads_sid().

02334 {
02335         d_printf(
02336                 "\nnet ads sid <sid> <attributes...>\n"\
02337                 "\nperform a raw LDAP search on a ADS server and dump the results\n"\
02338                 "The SID is in string format, and the attributes are a list of LDAP fields \n"\
02339                 "to show in the results\n\n"\
02340                 "Example: net ads sid 'S-1-5-32' distinguishedName\n\n"
02341                 );
02342         net_common_flags_usage(argc, argv);
02343         return -1;
02344 }

static int net_ads_sid ( int  argc,
const char **  argv 
) [static]

net_ads.c2350 行で定義されています。

参照先 ads_count_replies()ads_destroy()ads_dump()ads_errstr()ads_msgfree()ads_search_retry_sid()ads_startup()d_fprintf()d_printf()net_ads_sid_usage()string_to_sid().

参照元 net_ads().

02351 {
02352         ADS_STRUCT *ads;
02353         ADS_STATUS rc;
02354         const char *sid_string;
02355         const char **attrs;
02356         LDAPMessage *res = NULL;
02357         DOM_SID sid;
02358 
02359         if (argc < 1) {
02360                 return net_ads_sid_usage(argc, argv);
02361         }
02362 
02363         if (!ADS_ERR_OK(ads_startup(False, &ads))) {
02364                 return -1;
02365         }
02366 
02367         sid_string = argv[0];
02368         attrs = (argv + 1);
02369 
02370         if (!string_to_sid(&sid, sid_string)) {
02371                 d_fprintf(stderr, "could not convert sid\n");
02372                 ads_destroy(&ads);
02373                 return -1;
02374         }
02375 
02376         rc = ads_search_retry_sid(ads, &res, &sid, attrs);
02377         if (!ADS_ERR_OK(rc)) {
02378                 d_fprintf(stderr, "search failed: %s\n", ads_errstr(rc));
02379                 ads_destroy(&ads);
02380                 return -1;
02381         }       
02382 
02383         d_printf("Got %d replies\n\n", ads_count_replies(ads, res));
02384 
02385         /* dump the results */
02386         ads_dump(ads, res);
02387 
02388         ads_msgfree(ads, res);
02389         ads_destroy(&ads);
02390 
02391         return 0;
02392 }

static int net_ads_keytab_usage ( int  argc,
const char **  argv 
) [static]

net_ads.c2395 行で定義されています。

参照先 d_printf().

参照元 net_ads_keytab().

02396 {
02397         d_printf(
02398                 "net ads keytab <COMMAND>\n"\
02399 "<COMMAND> can be either:\n"\
02400 "  CREATE    Creates a fresh keytab\n"\
02401 "  ADD       Adds new service principal\n"\
02402 "  FLUSH     Flushes out all keytab entries\n"\
02403 "  HELP      Prints this help message\n"\
02404 "The ADD command will take arguments, the other commands\n"\
02405 "will not take any arguments.   The arguments given to ADD\n"\
02406 "should be a list of principals to add.  For example, \n"\
02407 "   net ads keytab add srv1 srv2\n"\
02408 "will add principals for the services srv1 and srv2 to the\n"\
02409 "system's keytab.\n"\
02410 "\n"
02411                 );
02412         return -1;
02413 }

static int net_ads_keytab_flush ( int  argc,
const char **  argv 
) [static]

net_ads.c2415 行で定義されています。

参照先 ads_destroy()ads_keytab_flush()ads_startup().

参照元 net_ads_keytab().

02416 {
02417         int ret;
02418         ADS_STRUCT *ads;
02419 
02420         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
02421                 return -1;
02422         }
02423         ret = ads_keytab_flush(ads);
02424         ads_destroy(&ads);
02425         return ret;
02426 }

static int net_ads_keytab_add ( int  argc,
const char **  argv 
) [static]

net_ads.c2428 行で定義されています。

参照先 ads_destroy()ads_keytab_add_entry()ads_startup()d_printf().

参照元 net_ads_keytab().

02429 {
02430         int i;
02431         int ret = 0;
02432         ADS_STRUCT *ads;
02433 
02434         d_printf("Processing principals to add...\n");
02435         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
02436                 return -1;
02437         }
02438         for (i = 0; i < argc; i++) {
02439                 ret |= ads_keytab_add_entry(ads, argv[i]);
02440         }
02441         ads_destroy(&ads);
02442         return ret;
02443 }

static int net_ads_keytab_create ( int  argc,
const char **  argv 
) [static]

net_ads.c2445 行で定義されています。

参照先 ads_destroy()ads_keytab_create_default()ads_startup().

参照元 net_ads_keytab().

02446 {
02447         ADS_STRUCT *ads;
02448         int ret;
02449 
02450         if (!ADS_ERR_OK(ads_startup(True, &ads))) {
02451                 return -1;
02452         }
02453         ret = ads_keytab_create_default(ads);
02454         ads_destroy(&ads);
02455         return ret;
02456 }

int net_ads_keytab ( int  argc,
const char **  argv 
)

net_ads.c2458 行で定義されています。

参照先 d_printf()net_ads_keytab_add()net_ads_keytab_create()net_ads_keytab_flush()net_ads_keytab_usage()net_run_function().

参照元 net_ads().

02459 {
02460         struct functable func[] = {
02461                 {"CREATE", net_ads_keytab_create},
02462                 {"ADD", net_ads_keytab_add},
02463                 {"FLUSH", net_ads_keytab_flush},
02464                 {"HELP", net_ads_keytab_usage},
02465                 {NULL, NULL}
02466         };
02467 
02468         if (!lp_use_kerberos_keytab()) {
02469                 d_printf("\nWarning: \"use kerberos keytab\" must be set to \"true\" in order to \
02470 use keytab functions.\n");
02471         }
02472 
02473         return net_run_function(argc, argv, func, net_ads_keytab_usage);
02474 }

int net_ads_help ( int  argc,
const char **  argv 
)

net_ads.c2476 行で定義されています。

参照先 net_ads_changetrustpw()net_ads_dns_usage()net_ads_group_usage()net_ads_info()net_ads_join_usage()net_ads_leave()net_ads_password()net_ads_printer_usage()net_ads_search_usage()net_ads_status()net_ads_usage()net_ads_user_usage()net_run_function().

参照元 net_ads()net_help().

02477 {
02478         struct functable func[] = {
02479                 {"USER", net_ads_user_usage},
02480                 {"GROUP", net_ads_group_usage},
02481                 {"PRINTER", net_ads_printer_usage},
02482                 {"SEARCH", net_ads_search_usage},
02483                 {"INFO", net_ads_info},
02484                 {"JOIN", net_ads_join_usage},
02485                 {"DNS", net_ads_dns_usage},
02486                 {"LEAVE", net_ads_leave},
02487                 {"STATUS", net_ads_status},
02488                 {"PASSWORD", net_ads_password},
02489                 {"CHANGETRUSTPW", net_ads_changetrustpw},
02490                 {NULL, NULL}
02491         };
02492 
02493         return net_run_function(argc, argv, func, net_ads_usage);
02494 }

int net_ads ( int  argc,
const char **  argv 
)

net_ads.c2496 行で定義されています。

参照先 net_ads_changetrustpw()net_ads_dn()net_ads_dns()net_ads_gpo()net_ads_group()net_ads_help()net_ads_info()net_ads_join()net_ads_keytab()net_ads_leave()net_ads_lookup()net_ads_password()net_ads_printer()net_ads_search()net_ads_sid()net_ads_status()net_ads_testjoin()net_ads_usage()net_ads_user()net_ads_workgroup()net_run_function().

02497 {
02498         struct functable func[] = {
02499                 {"INFO", net_ads_info},
02500                 {"JOIN", net_ads_join},
02501                 {"TESTJOIN", net_ads_testjoin},
02502                 {"LEAVE", net_ads_leave},
02503                 {"STATUS", net_ads_status},
02504                 {"USER", net_ads_user},
02505                 {"GROUP", net_ads_group},
02506                 {"DNS", net_ads_dns},
02507                 {"PASSWORD", net_ads_password},
02508                 {"CHANGETRUSTPW", net_ads_changetrustpw},
02509                 {"PRINTER", net_ads_printer},
02510                 {"SEARCH", net_ads_search},
02511                 {"DN", net_ads_dn},
02512                 {"SID", net_ads_sid},
02513                 {"WORKGROUP", net_ads_workgroup},
02514                 {"LOOKUP", net_ads_lookup},
02515                 {"KEYTAB", net_ads_keytab},
02516                 {"GPO", net_ads_gpo},
02517                 {"HELP", net_ads_help},
02518                 {NULL, NULL}
02519         };
02520         
02521         return net_run_function(argc, argv, func, net_ads_usage);
02522 }

static int net_ads_noads ( void   )  [static]

net_ads.c2526 行で定義されています。

参照先 d_fprintf().

02527 {
02528         d_fprintf(stderr, "ADS support not compiled in\n");
02529         return -1;
02530 }


Sambaに対してSat Aug 29 21:24:33 2009に生成されました。  doxygen 1.4.7