diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-12-09 23:39:00 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:47:15 -0500 |
commit | 7e6a90d6b839f5b015d1fb10a8e9601b30b7583e (patch) | |
tree | e08a91d2ae25113dc5d500e89db13f4460e66d23 | |
parent | 10275774499a6ff25efa066ce82d802641285772 (diff) | |
download | samba-7e6a90d6b839f5b015d1fb10a8e9601b30b7583e.tar.gz samba-7e6a90d6b839f5b015d1fb10a8e9601b30b7583e.tar.bz2 samba-7e6a90d6b839f5b015d1fb10a8e9601b30b7583e.zip |
r12156: added samdb_domain_sid(), a routine to get the domain sid by looking
up the rootDomainNamingContext in the rootdse, then getting the
objectsid from the root of the domain
(This used to be commit 152590101e64ec260304e4b34cb1e2ef64333a02)
-rw-r--r-- | source4/dsdb/samdb/samdb.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/source4/dsdb/samdb/samdb.c b/source4/dsdb/samdb/samdb.c index 9b63468f99..5e2fa94722 100644 --- a/source4/dsdb/samdb/samdb.c +++ b/source4/dsdb/samdb/samdb.c @@ -24,6 +24,7 @@ #include "librpc/gen_ndr/ndr_netlogon.h" #include "librpc/gen_ndr/ndr_misc.h" #include "lib/ldb/include/ldb.h" +#include "lib/ldb/include/ldb_errors.h" #include "system/time.h" #include "system/filesys.h" #include "db_wrap.h" @@ -993,3 +994,68 @@ struct ldb_dn *samdb_base_dn(TALLOC_CTX *mem_ctx) } return ldb_dn_string_compose(mem_ctx, NULL, "cn=%s", lp_netbios_name()); } + + +/* + work out the domain sid for the current open ldb +*/ +const struct dom_sid *samdb_domain_sid(struct ldb_context *ldb) +{ + const char *attrs[] = { "rootDomainNamingContext", NULL }; + int ret; + struct ldb_result *res = NULL; + TALLOC_CTX *tmp_ctx = talloc_new(ldb); + struct dom_sid *domain_sid; + const char *basedn_s; + struct ldb_dn *basedn; + + /* see if we have a cached copy */ + domain_sid = ldb_get_opaque(ldb, "cache.domain_sid"); + if (domain_sid) { + return domain_sid; + } + + basedn = ldb_dn_explode(tmp_ctx, ""); + if (basedn == NULL) { + goto failed; + } + + /* find the basedn of the domain from the rootdse */ + ret = ldb_search(ldb, basedn, LDB_SCOPE_BASE, NULL, attrs, &res); + talloc_steal(tmp_ctx, res); + if (ret != LDB_SUCCESS || res->count != 1) { + goto failed; + } + + basedn_s = ldb_msg_find_string(res->msgs[0], "rootDomainNamingContext", NULL); + if (basedn_s == NULL) { + goto failed; + } + + basedn = ldb_dn_explode(tmp_ctx, basedn_s); + if (basedn == NULL) { + goto failed; + } + + /* find the domain_sid */ + domain_sid = samdb_search_dom_sid(ldb, tmp_ctx, basedn, + "objectSid", "objectClass=domainDNS"); + if (domain_sid == NULL) { + goto failed; + } + + /* cache the domain_sid in the ldb */ + if (ldb_set_opaque(ldb, "cache.domain_sid", domain_sid) != LDB_SUCCESS) { + goto failed; + } + + talloc_steal(ldb, domain_sid); + talloc_free(tmp_ctx); + + return domain_sid; + +failed: + DEBUG(1,("Failed to find domain_sid for open ldb\n")); + talloc_free(tmp_ctx); + return NULL; +} |