DS_NAME_RESULT_ITEMW LookupUnknownName(DsServer dc, uint flags, uint formatDesired, string name) { DS_NAME_RESULT_ITEMW result = new DS_NAME_RESULT_ITEMW(); uint[] formatOrder = new uint[] { (uint)DS_NAME_FORMAT.DS_FQDN_1779_NAME, (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME, (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME, (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME, (uint)DS_NAME_FORMAT.DS_UNIQUE_ID_NAME, (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME, (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME, (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME, (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX }; foreach (uint format in formatOrder) { result = LookupNames(dc, flags, format, formatDesired, name); if (result.status != DS_NAME_ERROR.DS_NAME_ERROR_NOT_FOUND) { return(result); } } return(result); }
/// <summary> /// Verify CrackNames results. /// </summary> /// <param name="machine"></param> /// <param name="retVal"></param> /// <param name="dwInVersion"></param> /// <param name="req"></param> /// <param name="outVersion"></param> /// <param name="reply"></param> public void VerifyDrsCrackNames( EnvironmentConfig.Machine machine, uint retVal, uint dwInVersion, DRS_MSG_CRACKREQ req, uint?outVersion, DRS_MSG_CRACKREPLY?reply) { // IDL_DRSCrackNames supports only V1 testSite.Assert.IsTrue(outVersion == 1, "IDL_DRSCrackNames: Checking outVersion - got: {0}, expect: {1}, outVersion should be 1.", outVersion, 1); testSite.Assert.IsNotNull(reply, "IDL_DRSCrackNames: Checking outMessage - outMessage should not be null."); testSite.Assert.IsNotNull(reply.Value.V1.pResult, "IDL_DRSCrackNames: Checking pResult - pResult in outMessage should not be null."); DsServer srv = (DsServer)EnvironmentConfig.MachineStore[machine]; uint flag = req.V1.dwFlags; switch (flag) { case (uint)DRS_MSG_CRACKREQ_FLAGS.DS_NAME_FLAG_GC_VERIFY: { const uint ERROR_DS_GCVERIFY_ERROR = 0x20e1; bool isGc = ldapAd.IsGc(srv); if (!isGc) { testSite.Assert.IsTrue( retVal == ERROR_DS_GCVERIFY_ERROR, "IDL_DRSCrackNames: Cannot verify the GC server {0}", srv.NetbiosName); } else { testSite.Assert.IsTrue( retVal == (uint)DS_NAME_ERROR.DS_NAME_NO_ERROR, "IDL_DRSCrackNames: DC {0} is not a GC server", srv.NetbiosName); } } break; default: break; } // formats uint formatOffered = req.V1.formatOffered; switch (formatOffered) { case (uint)DS_NAME_FORMAT.DS_INVALID_NAME: // Invalid name, just break. break; case (uint)formatOffered_Values.DS_LIST_SITES: VerifyCrackNamesListAllSites(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_SERVERS_IN_SITE: VerifyCrackNamesListServersInSite(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_DOMAINS_IN_SITE: VerifyCrackNamesListDomainsInSite(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_SERVERS_FOR_DOMAIN_IN_SITE: VerifyCrackNamesListServersForDomainInSite(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_INFO_FOR_SERVER: VerifyCrackNamesListInfoForServer(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_ROLES: VerifyCrackNamesListRoles(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_DOMAINS: VerifyCrackNamesListDomains(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_NCS: VerifyCrackNamesListNcs(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_SERVERS_WITH_DCS_IN_SITE: VerifyCrackNamesListServersWithDcsInSite(srv, req, reply); break; case (uint)formatOffered_Values.DS_LIST_GLOBAL_CATALOG_SERVERS: VerifyCrackNamesListGlobalCatalogServers(srv, req, reply); break; case (uint)formatOffered_Values.DS_MAP_SCHEMA_GUID: VerifyCrackNamesMapSchemaGuid(srv, req, reply); break; case (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME: case (uint)DS_NAME_FORMAT.DS_FQDN_1779_NAME: case (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME: case (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME: case (uint)DS_NAME_FORMAT.DS_UNIQUE_ID_NAME: case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME: case (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME: case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX: case (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME: case (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME: case (uint)DS_NAME_FORMAT.DS_DNS_DOMAIN_NAME: case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN: case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX: case (uint)formatOffered_Values.DS_ALT_SECURITY_IDENTITIES_NAME: case (uint)formatOffered_Values.DS_STRING_SID_NAME: case (uint)formatOffered_Values.DS_USER_PRINCIPAL_NAME_AND_ALTSECID: { for (int i = 0; i < req.V1.cNames; ++i) { DS_NAME_RESULT_ITEMW r = ldapAd.LookupNames( srv, req.V1.dwFlags, req.V1.formatOffered, req.V1.formatDesired, req.V1.rpNames[i] ); // status code testSite.Assert.IsTrue( r.status == reply.Value.V1.pResult[0].rItems[i].status, "IDL_DRSCrackNames: Verify status failed, expect: {0}, got: {1}", r.status, reply.Value.V1.pResult[0].rItems[i].status ); // name if (r.pName == null) { testSite.Assert.IsNull(reply.Value.V1.pResult[0].rItems[i].pName, "IDL_DRSCrackNames: Verify pName failed, expect: null, got: {0}.", reply.Value.V1.pResult[0].rItems[i].pName); } else { testSite.Assert.IsTrue( r.pName == reply.Value.V1.pResult[0].rItems[i].pName, "IDL_DRSCrackNames: Verify pName failed, expect: {0}, got: {1}.", r.pName, reply.Value.V1.pResult[0].rItems[i].pName ); } // domain if (r.pDomain == null) { testSite.Assert.IsNull(reply.Value.V1.pResult[0].rItems[i].pDomain, "IDL_DRSCrackNames: Verify pDomain failed, expect: null, got: {0}.", reply.Value.V1.pResult[0].rItems[i].pDomain); } else { testSite.Assert.IsTrue( r.pDomain == reply.Value.V1.pResult[0].rItems[i].pDomain, "IDL_DRSCrackNames: Verify pDomain failed, expect: {0}, got: {1}.", r.pDomain, reply.Value.V1.pResult[0].rItems[i].pDomain ); } } } break; default: throw new NotImplementedException(); } }
internal static DirectoryServiceNameResult Create(DS_NAME_RESULT_ITEMW item) { return(new DirectoryServiceNameResult(item)); }
public DS_NAME_RESULT_ITEMW LookupNames( DsServer dc, uint flags, uint formatOffered, uint formatDesired, string name) { DS_NAME_RESULT_ITEMW result = new DS_NAME_RESULT_ITEMW(); string referredDomain = ""; // Unknown name if (formatOffered == (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME) { return(LookupUnknownName(dc, flags, formatDesired, name)); } DSNAME[] rt = null; string domainName = null; switch (formatOffered) { case (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME: return(LookupUnknownName(dc, flags, formatDesired, name)); case (uint)DS_NAME_FORMAT.DS_FQDN_1779_NAME: { rt = LookupAttr(dc, flags, "distinguishedName", name); if (EnvironmentConfig.TestDS) { DSNAME?dcDsname = GetDsName(dc, RetrieveDCSuffixFromDn(name)); if (dcDsname != null) { domainName = DomainDNSNameFromDomain(dc, dcDsname.Value); } } } break; case (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME: { rt = LookupAttr(dc, flags, "sAMAccountName", LdapUtility.UserNameFromNT4AccountName(name)); if (EnvironmentConfig.TestDS) { domainName = LdapUtility.DomainNameFromNT4AccountName(name); } } break; case (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME: { rt = LookupUPNAndAltSecID(dc, flags, false, name); if (EnvironmentConfig.TestDS) { domainName = DomainNameFromUPN(name); } } break; case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME: { DSNAME?v = LookupCanonicalName(dc, name); if (v != null) { rt = new DSNAME[] { v.Value } } ; else { rt = null; } if (EnvironmentConfig.TestDS) { domainName = DomainNameFromCanonicalName(name); } } break; case (uint)DS_NAME_FORMAT.DS_UNIQUE_ID_NAME: { RootDSE rootDse = LdapUtility.GetRootDSE(dc); // The GUID is in the curly braced form, so we need // to remove the braces first. if (!name.Contains("{") && name.Contains("}")) { rt = null; break; } string guidStr = name.Substring(1, name.Length - 2); Guid guid = new Guid(guidStr); string dn = null; dn = LdapUtility.GetObjectDnByGuid(dc, rootDse.rootDomainNamingContext, guid); if (dn == null) { dn = LdapUtility.GetObjectDnByGuid(dc, rootDse.configurationNamingContext, guid); } if (dn == null) { dn = LdapUtility.GetObjectDnByGuid(dc, rootDse.schemaNamingContext, guid); } if (dn == null) { break; } rt = new DSNAME[] { LdapUtility.CreateDSNameForObject(dc, dn) }; } break; case (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME: { rt = LookupAttr(dc, flags, "displayName", name); } break; case (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME: { rt = LookupSPN(dc, flags, name); if (EnvironmentConfig.TestDS) { domainName = GetServiceNameFromSPN(name); } } break; case (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME: case (uint)formatOffered_Values.DS_STRING_SID_NAME: { rt = LookupSID(dc, flags, SidFromStringSid(name)); if (EnvironmentConfig.TestDS) { domainName = DomainNameFromSid(dc, DomainSidFromSid(SidFromStringSid(name))); } } break; case (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX: { DSNAME?v = LookupCanonicalName(dc, CanonicalNameFromCanonicalNameEx(name)); if (v == null) { rt = null; } else { rt = new DSNAME[] { v.Value } }; if (EnvironmentConfig.TestDS) { domainName = DomainNameFromCanonicalName(name); } } break; case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN: case (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX: { rt = LookupAttr(dc, flags, "sAMAccountName", name); } break; case (uint)formatOffered_Values.DS_ALT_SECURITY_IDENTITIES_NAME: { rt = LookupAttr(dc, flags, "altSecurityIdentities", name); } break; case (uint)formatOffered_Values.DS_USER_PRINCIPAL_NAME_AND_ALTSECID: { rt = LookupUPNAndAltSecID(dc, flags, true, name); if (EnvironmentConfig.TestDS) { domainName = DomainNameFromUPN(name); } } break; default: rt = null; break; } if (rt == null && domainName != null) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_DOMAIN_ONLY; if (formatOffered == (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME || formatOffered == (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME || formatOffered == (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME || formatOffered == (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME || formatOffered == (uint)formatOffered_Values.DS_STRING_SID_NAME || formatOffered == (uint)formatOffered_Values.DS_USER_PRINCIPAL_NAME_AND_ALTSECID) { if (TrustInfo.IsDomainNameInTrustedForest(dc, domainName, ref referredDomain)) { result.pDomain = referredDomain; if ((flags & (uint)DRS_MSG_CRACKREQ_FLAGS.DS_NAME_FLAG_TRUST_REFERRAL) > 0) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_TRUST_REFERRAL; } else { result.status = DS_NAME_ERROR.DS_NAME_ERROR_DOMAIN_ONLY; } } } return(result); } if (rt == null) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_FOUND; return(result); } if (rt.Length > 1) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_UNIQUE; return(result); } DSNAME obj = rt[0]; if (formatOffered == (uint)formatOffered_Values.DS_NT4_ACCOUNT_NAME_SANS_DOMAIN_EX) { string uacStr = (string)GetAttributeValue( dc, LdapUtility.ConvertUshortArrayToString(obj.StringName), "userAccountControl"); uint uac = Convert.ToUInt32(uacStr); const uint ADS_UF_ACCOUNTDISABLE = 0x0002; const uint ADS_UF_TEMP_DUPLICATE_ACCOUNT = 0x0100; if ((uac & (ADS_UF_ACCOUNTDISABLE | ADS_UF_TEMP_DUPLICATE_ACCOUNT)) > 0) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_FOUND; return(result); } } string[] names = ConstructOutput(dc, obj, formatDesired); if ((names == null) && (obj.SidLen != 0) && ((flags & (uint)DRS_MSG_CRACKREQ_FLAGS.DS_NAME_FLAG_PRIVATE_RESOLVE_FPOS) > 0)) { if (formatDesired == (uint)DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_DISPLAY_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX || formatDesired == (uint)DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME || formatDesired == (uint)formatDesired_Values.DS_USER_PRINCIPAL_NAME_FOR_LOGON || formatDesired == (uint)DS_NAME_FORMAT.DS_SERVICE_PRINCIPAL_NAME) { bool fCanonicalEx = false; if (formatDesired == (uint)DS_NAME_FORMAT.DS_CANONICAL_NAME_EX) { fCanonicalEx = true; } result = LookupFPO(fCanonicalEx, obj, result); return(result); } } if (names == null) { if (formatDesired == (uint)DS_NAME_FORMAT.DS_SID_OR_SID_HISTORY_NAME || formatDesired == (uint)DS_NAME_FORMAT.DS_UNKNOWN_NAME) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_RESOLVING; } else { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NO_MAPPING; } return(result); } if (names.Length > 1) { result.status = DS_NAME_ERROR.DS_NAME_ERROR_NOT_UNIQUE; return(result); } result.pName = names[0]; if (EnvironmentConfig.TestDS) { string objDn = LdapUtility.ConvertUshortArrayToString(obj.StringName); DSNAME?dcDsname = GetDsName(dc, RetrieveDCSuffixFromDn(objDn)); string domainDn = ""; if (dcDsname != null) { domainDn = DomainDNSNameFromDomain(dc, dcDsname.Value); } result.pDomain = domainDn; } else { result.pDomain = ""; } result.status = DS_NAME_ERROR.DS_NAME_NO_ERROR; return(result); }
private DirectoryServiceNameResult(DS_NAME_RESULT_ITEMW item) { Status = item.status; Domain = item.pDomain; Name = item.pName; }