1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

r1925: now we lookup the domain controller

and fallback to a workstation name

metze
(This used to be commit 2012d90f268f69a3a4e5890a0f3615237853bd0b)
This commit is contained in:
Stefan Metzmacher 2004-08-19 15:04:14 +00:00 committed by Gerald (Jerry) Carter
parent 3ccba74549
commit bd225f8c28
2 changed files with 62 additions and 9 deletions

View File

@ -32,6 +32,26 @@ struct libnet_context {
} user;
};
/* struct and enum for finding a domain controller */
enum libnet_find_pdc_level {
LIBNET_FIND_PDC_GENERIC
};
union libnet_find_pdc {
/* find to a domains PDC */
struct {
enum libnet_find_pdc_level level;
struct {
const char *domain_name;
} in;
struct {
const char *pdc_name;
} out;
} generic;
};
/* struct and enum for connecting to a dcerpc inferface */
enum libnet_rpc_connect_level {
LIBNET_RPC_CONNECT_PDC

View File

@ -20,21 +20,54 @@
#include "includes.h"
/* find a domain pdc generic */
static NTSTATUS libnet_find_pdc_generic(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_find_pdc *r)
{
BOOL ret;
struct in_addr ip;
ret = get_pdc_ip(mem_ctx, r->generic.in.domain_name, &ip);
if (!ret) {
/* fallback to a workstation name */
ret = resolve_name(mem_ctx, r->generic.in.domain_name, &ip, 0x20);
if (!ret) {
return NT_STATUS_NO_LOGON_SERVERS;
}
}
r->generic.out.pdc_name = talloc_strdup(mem_ctx, inet_ntoa(ip));
return NT_STATUS_OK;
}
/* find a domain pdc */
NTSTATUS libnet_find_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_find_pdc *r)
{
switch (r->generic.level) {
case LIBNET_FIND_PDC_GENERIC:
return libnet_find_pdc_generic(ctx, mem_ctx, r);
}
return NT_STATUS_INVALID_LEVEL;
}
/* connect to a dcerpc interface of a domains PDC */
NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r)
static NTSTATUS libnet_rpc_connect_pdc(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_rpc_connect *r)
{
NTSTATUS status;
const char *binding = NULL;
const char *pdc = NULL;
union libnet_find_pdc f;
/* TODO: find real PDC!
* for now I use the lp_netbios_name()
* that's the most important for me as we don't have
* smbpasswd in samba4 (and this is good!:-) --metze
*/
pdc = lp_netbios_name();
f.generic.level = LIBNET_FIND_PDC_GENERIC;
f.generic.in.domain_name = r->pdc.in.domain_name;
binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",pdc);
status = libnet_find_pdc(ctx, mem_ctx, &f);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
binding = talloc_asprintf(mem_ctx, "ncacn_np:%s",
f.generic.out.pdc_name);
status = dcerpc_pipe_connect(&r->pdc.out.dcerpc_pipe,
binding,