void VerifyCrackNamesListDomains(
            DsServer dc,
            DRS_MSG_CRACKREQ req,
            DRS_MSG_CRACKREPLY?reply)
        {
            DsDomain[] domains = ldapAd.ListDomains(dc);

            testSite.Assert.IsTrue(
                reply.Value.V1.pResult[0].cItems == domains.Length,
                "IDL_DRSCrackNames: DS_LIST_DOMAINS: wrong domain count, expect:{0}, got:{1}",
                domains.Length,
                reply.Value.V1.pResult[0].cItems
                );

            string[] domainDns = new string[domains.Length];
            for (int i = 0; i < domains.Length; ++i)
            {
                domainDns[i] = domains[i].Name;
            }

            DS_NAME_RESULTW result = reply.Value.V1.pResult[0];

            string[] listDomainDns = new string[result.cItems];
            for (int i = 0; i < result.cItems; ++i)
            {
                testSite.Assert.IsTrue(
                    result.rItems[i].status == DS_NAME_ERROR.DS_NAME_NO_ERROR,
                    "IDL_DRSCrackNames: DS_LIST_DOMAINS: return status should be 0, got {0}",
                    result.rItems[i].status
                    );
                listDomainDns[i] = result.rItems[i].pName;
            }

            testSite.Assert.IsTrue(
                DrsrHelper.IsStringArrayEqual(domainDns, listDomainDns),
                "IDL_DRSCrackNames: DS_LIST_DOMAINS: failed to verify domain DNs."
                );
        }
        void VerifyCrackNamesListRoles(
            DsServer dc,
            DRS_MSG_CRACKREQ req,
            DRS_MSG_CRACKREPLY?reply)
        {
            bool     isLds  = (dc is AdldsServer);
            DsDomain domain = dc.Domain;

            DS_NAME_RESULTW result = reply.Value.V1.pResult[0];

            if (isLds)
            {
                testSite.Assert.IsTrue(
                    result.cItems == 2,
                    "IDL_DRSCrackNames: DS_LIST_ROLES: FSMO role owner of a LDS server should be 2."
                    );
            }
            else
            {
                testSite.Assert.IsTrue(
                    result.cItems == 5,
                    "IDL_DRSCrackNames: DS_LIST_ROLES: FSMO role owner of a DS server should be 5."
                    );
            }

            for (int i = 0; i < result.cItems; ++i)
            {
                testSite.Assert.IsTrue(
                    result.rItems[i].status == DS_NAME_ERROR.DS_NAME_NO_ERROR,
                    "IDL_DRSCrackNames: DS_LIST_ROLES: return status should be 0, got {0}",
                    result.rItems[i].status
                    );
            }

            testSite.Assert.IsTrue(
                domain.FsmoRoleOwners[FSMORoles.Schema] == result.rItems[0].pName,
                "IDL_DRSCrackNames: DS_LIST_ROLES: failed to verify schema owner."
                );

            testSite.Assert.IsTrue(
                domain.FsmoRoleOwners[FSMORoles.DomainNaming] == result.rItems[0].pName,
                "IDL_DRSCrackNames: DS_LIST_ROLES: failed to verify domain naming owner."
                );

            // DS server might have 3 more roles.
            if (!isLds)
            {
                testSite.Assert.IsTrue(
                    domain.FsmoRoleOwners[FSMORoles.PDC] == result.rItems[0].pName,
                    "IDL_DRSCrackNames: DS_LIST_ROLES: failed to verify PDCE owner."
                    );
                testSite.Assert.IsTrue(
                    domain.FsmoRoleOwners[FSMORoles.RidAllocation] == result.rItems[0].pName,
                    "IDL_DRSCrackNames: DS_LIST_ROLES: failed to verify RID allocation owner."
                    );
                testSite.Assert.IsTrue(
                    domain.FsmoRoleOwners[FSMORoles.Infrastructure] == result.rItems[0].pName,
                    "IDL_DRSCrackNames: DS_LIST_ROLES: failed to verify Infrastructure owner."
                    );
            }
        }