Beispiel #1
0
        protected override void BeginProcessing()
        {
            conn             = DirectoryUtils.GetLdapConnection(ConnectionType.Ldap);
            forestRootDomain = DirectoryUtils.GetForestRootDomain();

            base.BeginProcessing();
        }
        public static List <string> GetComputerDN(string ComputerName)
        {
            //searching against default domain controller and GC interface
            List <string> retVal = new List <string>();

            using (LdapConnection connGC = GetLdapConnection(ConnectionType.GC))
            {
                ForestInfo    di           = GetForestRootDomain();
                SearchRequest rq           = new SearchRequest();
                string        searchString = string.Format("(&(objectClass=computer)(cn={0}))", ComputerName);
                rq        = new SearchRequest();
                rq.Filter = searchString;
                rq.Scope  = SearchScope.Subtree;
                SearchResponse rsp = (SearchResponse)connGC.SendRequest(rq);
                foreach (SearchResultEntry sr in rsp.Entries)
                {
                    retVal.Add(sr.DistinguishedName);
                }
            }
            return(retVal);
        }
Beispiel #3
0
        public static ForestInfo GetForestRootDomain()
        {
            ForestInfo retVal = new ForestInfo();

            string[] propsToLoad = new string[] { "rootDomainNamingContext", "configurationNamingContext", "schemaNamingContext", "dnsHostName" };
            using (LdapConnection conn = GetLdapConnection(ConnectionType.Ldap))
            {
                SearchRequest rq = new SearchRequest();
                rq.Attributes.AddRange(propsToLoad);
                rq.Scope = SearchScope.Base;
                ExtendedDNControl ctrl = new ExtendedDNControl(ExtendedDNFlag.StandardString);
                rq.Controls.Add(ctrl);
                SearchResponse rsp = (SearchResponse)conn.SendRequest(rq);

                string rootNC = (rsp.Entries[0].Attributes["rootDomainNamingContext"].GetValues(typeof(string)))[0] as string;
                int    start  = rootNC.IndexOf("<SID=", StringComparison.CurrentCultureIgnoreCase);
                if (start > -1)
                {
                    retVal.RootDomain.Dn = rootNC.Split(';')[2];
                    int end = rootNC.IndexOf('>', start);
                    start += 5; //prefix of SID: <SID=

                    string sid = rootNC.Substring(start, end - start);
                    retVal.RootDomain.Sid = new SecurityIdentifier(sid);
                }

                retVal.ConfigurationNamingContext = ((rsp.Entries[0].Attributes["configurationNamingContext"].GetValues(typeof(string)))[0] as string).Split(';')[1];
                retVal.SchemaNamingContext        = ((rsp.Entries[0].Attributes["schemaNamingContext"].GetValues(typeof(string)))[0] as string).Split(';')[1];
                retVal.RootDomain.ConnectedHost   = rsp.Entries[0].Attributes["dnsHostName"].GetValues(typeof(string))[0] as string;
                //get DNS name of forest root domain
                rq = new SearchRequest();
                rq.DistinguishedName = "cn=Partitions," + retVal.ConfigurationNamingContext;
                rq.Scope             = SearchScope.OneLevel;
                rq.Attributes.Add("dnsRoot");
                rq.Filter = string.Format(System.Globalization.CultureInfo.InvariantCulture, "(&(objectClass=crossRef)(nCName={0}))", retVal.RootDomain.Dn);
                rsp       = (SearchResponse)conn.SendRequest(rq);
                retVal.RootDomain.DnsName = rsp.Entries[0].Attributes["dnsRoot"].GetValues(typeof(string))[0] as string;
            }
            return(retVal);
        }
Beispiel #4
0
        public static ReadOnlyCollection <string> GetComputerDN(string computerName)
        {
            //searching against default domain controller and GC interface
            List <string> retVal = new List <string>();

            using (LdapConnection connGC = GetLdapConnection(ConnectionType.Gc))
            {
                ForestInfo    di           = GetForestRootDomain();
                SearchRequest rq           = new SearchRequest();
                string        searchString = string.Format(System.Globalization.CultureInfo.InvariantCulture, "(&(objectClass=computer)(cn={0}))", computerName);
                rq                   = new SearchRequest();
                rq.Filter            = searchString;
                rq.Scope             = SearchScope.Subtree;
                rq.DistinguishedName = di.RootDomain.Dn;
                SearchResponse rsp = (SearchResponse)connGC.SendRequest(rq);
                foreach (SearchResultEntry sr in rsp.Entries)
                {
                    retVal.Add(sr.DistinguishedName);
                }
            }
            return(new ReadOnlyCollection <string>(retVal));
        }
Beispiel #5
0
        protected override void ProcessRecord()
        {
            ForestInfo fi = DirectoryUtils.GetForestRootDomain();

            using (LdapConnection conn = DirectoryUtils.GetLdapConnection(ConnectionType.Ldap))
            {
                AddRequest    rqAdd;
                ModifyRequest rqMod;

                AddResponse    rspAdd;
                ModifyResponse rspMod;

                //password timestamp
                rqAdd = new AddRequest();

                rqAdd.DistinguishedName = "cn=" + Constants.TimestampAttributeName + "," + fi.SchemaNamingContext;
                rqAdd.Attributes.Add(new DirectoryAttribute("ldapDisplayName", Constants.TimestampAttributeName));
                rqAdd.Attributes.Add(new DirectoryAttribute("adminDisplayName", Constants.TimestampAttributeName));

                rqAdd.Attributes.Add(new DirectoryAttribute("objectClass", "attributeSchema"));
                rqAdd.Attributes.Add(new DirectoryAttribute("attributeId", "1.2.840.113556.1.8000.2554.50051.45980.28112.18903.35903.6685103.1224907.2.2"));
                rqAdd.Attributes.Add(new DirectoryAttribute("attributeSyntax", "2.5.5.16"));
                rqAdd.Attributes.Add(new DirectoryAttribute("omSyntax", "65"));
                rqAdd.Attributes.Add(new DirectoryAttribute("isSingleValued", "TRUE"));
                rqAdd.Attributes.Add(new DirectoryAttribute("systemOnly", "FALSE"));
                rqAdd.Attributes.Add(new DirectoryAttribute("isMemberOfPartialAttributeSet", "FALSE"));
                rqAdd.Attributes.Add(new DirectoryAttribute("searchFlags", "0"));
                rqAdd.Attributes.Add(new DirectoryAttribute("showInAdvancedViewOnly", "FALSE"));

                try
                {
                    rspAdd = conn.SendRequest(rqAdd) as AddResponse;
                    WriteObject(new DirectoryOperationStatus(DirectoryOperationType.AddSchemaAttribute, rqAdd.DistinguishedName, rspAdd.ResultCode));
                }
                catch (DirectoryOperationException ex)
                {
                    if (ex.Response.ResultCode == ResultCode.EntryAlreadyExists)
                    {
                        WriteObject(new DirectoryOperationStatus(DirectoryOperationType.AddSchemaAttribute, rqAdd.DistinguishedName, ex.Response.ResultCode));
                    }
                    else
                    {
                        throw;
                    }
                }

                //password
                rqAdd = new AddRequest();
                rqAdd.DistinguishedName = "cn=" + Constants.PasswordAttributeName + "," + fi.SchemaNamingContext;
                rqAdd.Attributes.Add(new DirectoryAttribute("ldapDisplayName", Constants.PasswordAttributeName));
                rqAdd.Attributes.Add(new DirectoryAttribute("adminDisplayName", Constants.PasswordAttributeName));
                rqAdd.Attributes.Add(new DirectoryAttribute("objectClass", "attributeSchema"));
                rqAdd.Attributes.Add(new DirectoryAttribute("attributeId", "1.2.840.113556.1.8000.2554.50051.45980.28112.18903.35903.6685103.1224907.2.1"));
                rqAdd.Attributes.Add(new DirectoryAttribute("attributeSyntax", "2.5.5.5"));
                rqAdd.Attributes.Add(new DirectoryAttribute("omSyntax", "19"));
                rqAdd.Attributes.Add(new DirectoryAttribute("isSingleValued", "TRUE"));
                rqAdd.Attributes.Add(new DirectoryAttribute("systemOnly", "FALSE"));
                rqAdd.Attributes.Add(new DirectoryAttribute("isMemberOfPartialAttributeSet", "FALSE"));
                rqAdd.Attributes.Add(new DirectoryAttribute("searchFlags", "904"));
                rqAdd.Attributes.Add(new DirectoryAttribute("showInAdvancedViewOnly", "FALSE"));

                try
                {
                    rspAdd = conn.SendRequest(rqAdd) as AddResponse;
                    WriteObject(new DirectoryOperationStatus(DirectoryOperationType.AddSchemaAttribute, rqAdd.DistinguishedName, rspAdd.ResultCode));
                }
                catch (DirectoryOperationException ex)
                {
                    if (ex.Response.ResultCode == ResultCode.EntryAlreadyExists)
                    {
                        WriteObject(new DirectoryOperationStatus(DirectoryOperationType.AddSchemaAttribute, rqAdd.DistinguishedName, ex.Response.ResultCode));
                    }
                    else
                    {
                        throw;
                    }
                }

                //Reload schema
                rqMod = new ModifyRequest();
                DirectoryAttributeModification schemaReload = new DirectoryAttributeModification();
                schemaReload.Name      = "SchemaUpdateNow";
                schemaReload.Operation = DirectoryAttributeOperation.Add;
                schemaReload.Add("1");

                rqMod.Modifications.Add(schemaReload);

                //we don't sent result of this operation to pipeline
                conn.SendRequest(rqMod);

                //modify computer object
                rqMod = new ModifyRequest();
                rqMod.DistinguishedName = "cn=computer," + fi.SchemaNamingContext;
                DirectoryAttributeModification mayContain = new DirectoryAttributeModification();
                mayContain.Name      = "mayContain";
                mayContain.Operation = DirectoryAttributeOperation.Add;
                mayContain.Add(Constants.PasswordAttributeName);
                mayContain.Add(Constants.TimestampAttributeName);
                rqMod.Modifications.Add(mayContain);

                try
                {
                    rspMod = conn.SendRequest(rqMod) as ModifyResponse;
                    WriteObject(new DirectoryOperationStatus(DirectoryOperationType.ModifySchemaClass, rqMod.DistinguishedName, rspMod.ResultCode));
                }
                catch (DirectoryOperationException ex)
                {
                    if (ex.Response.ResultCode == ResultCode.AttributeOrValueExists)
                    {
                        WriteObject(new DirectoryOperationStatus(DirectoryOperationType.ModifySchemaClass, rqMod.DistinguishedName, ex.Response.ResultCode));
                    }
                    else
                    {
                        throw;
                    }
                }

                //Reload schema
                rqMod = new ModifyRequest();

                rqMod.Modifications.Add(schemaReload);
                conn.SendRequest(rqMod);
            }
        }