Exemplo n.º 1
0
 public bool EnumerateAccount(TypeOfEnumeration method, int MaximumNumber = int.MaxValue)
 {
     if (method == TypeOfEnumeration.Samr)
     {
         return(EnumerateAccountUsingSamr(method, MaximumNumber));
     }
     else if (method == TypeOfEnumeration.Lsa)
     {
         return(EnumerateAccountUsingLsa(method, MaximumNumber));
     }
     return(false);
 }
Exemplo n.º 2
0
        private bool EnumerateAccountUsingLsa(TypeOfEnumeration method, int MaximumNumber)
        {
            Trace.WriteLine("EnumerateAccountUsingLsa");
            int    UserEnumerated = 0;
            Int32  returnCode;
            IntPtr PolicyHandle = IntPtr.Zero;
            lsa    lsa          = new lsa();

            lsa.RPCTimeOut = this.RPCTimeOut;
            returnCode     = lsa.LsarOpenPolicy(Server, 0x00000801, out PolicyHandle);
            if (returnCode != 0)
            {
                Trace.WriteLine("LsarOpenPolicy " + returnCode);
                return(false);
            }
            try
            {
                LSA_DOMAIN_INFORMATION PolicyInformation;
                returnCode = lsa.LsarQueryInformationPolicy(PolicyHandle, 5, out PolicyInformation);
                if (returnCode != 0)
                {
                    Trace.WriteLine("LsarQueryInformationPolicy " + returnCode);
                    return(false);
                }
                uint currentRid = 500;
                int  iteration  = 0;
                // allows 10*1000 sid non resolved
                int retrycount = 0;
                while ((returnCode == 0 || returnCode == 0x00000107 || (retrycount < 10 && returnCode == -1073741709)) && UserEnumerated < MaximumNumber)
                {
                    Trace.WriteLine("LsarLookupSids iteration " + iteration++);
                    SecurityIdentifier[] enumBuffer = new SecurityIdentifier[1000];
                    for (int i = 0; i < enumBuffer.Length; i++)
                    {
                        enumBuffer[i] = BuildSIDFromDomainSidAndRid(PolicyInformation.DomainSid, currentRid++);
                    }
                    UInt32 MappedCount;
                    LSA_LOOKUP_RESULT[] LookupResult;
                    returnCode = lsa.LsarLookupSids(PolicyHandle, enumBuffer, out LookupResult, 2, out MappedCount);
                    if (returnCode == 0 || returnCode == 0x00000107)
                    {
                        retrycount = 0;
                        for (int i = 0; i < enumBuffer.Length && UserEnumerated < MaximumNumber; i++)
                        {
                            if (LookupResult[i].Use == SID_NAME_USE.SidTypeUser && !String.IsNullOrEmpty(LookupResult[i].TranslatedName))
                            {
                                UserEnumerated++;
                                Trace.WriteLine("User:"******"LsarLookupSids " + returnCode);
                    }
                }
            }
            finally
            {
                returnCode = lsa.LsarClose(ref PolicyHandle);
            }
            Trace.WriteLine("EnumerateAccountUsingLsa done");
            return(UserEnumerated > 0);
        }
Exemplo n.º 3
0
        private bool EnumerateAccountUsingSamr(TypeOfEnumeration method, int MaximumNumber)
        {
            Trace.WriteLine("EnumerateAccountUsingSamr");
            int    UserEnumerated = 0;
            IntPtr ServerHandle   = IntPtr.Zero;
            samr   sam            = new samr();

            sam.RPCTimeOut = this.RPCTimeOut;
            Int32 returnCode;

            returnCode = sam.SamrConnect(Server, out ServerHandle, 0x20030);
            if (returnCode != 0)
            {
                Trace.WriteLine("SamrConnect " + returnCode);
                return(false);
            }
            try
            {
                IntPtr enumerationContext       = IntPtr.Zero;
                SAMR_ENUMERATION_ENTRY[] Buffer = null;
                UInt32 CountReturned            = 0;
                returnCode = sam.SamrEnumerateDomainsInSamServer(ServerHandle, ref enumerationContext, out Buffer, 10000, out CountReturned);
                if (returnCode != 0)
                {
                    Trace.WriteLine("SamrEnumerateDomainsInSamServer " + returnCode);
                    return(false);
                }
                for (ulong i = 0; i < CountReturned; i++)
                {
                    Trace.WriteLine("Domain:" + Buffer[i].Name);
                    SecurityIdentifier       DomainId;
                    IntPtr                   DomainHandle           = IntPtr.Zero;
                    IntPtr                   enumerationContextUser = IntPtr.Zero;
                    SAMR_ENUMERATION_ENTRY[] EnumerationBuffer      = null;
                    UInt32                   UserCount = 0;
                    returnCode = sam.SamrLookupDomainInSamServer(ServerHandle, Buffer[i].Name, out DomainId);
                    if (returnCode < 0)
                    {
                        Trace.WriteLine("SamrLookupDomainInSamServer " + returnCode);
                        continue;
                    }
                    returnCode = sam.SamrOpenDomain(ServerHandle, 0x100, DomainId, out DomainHandle);
                    if (returnCode < 0)
                    {
                        Trace.WriteLine("SamrOpenDomain " + returnCode);
                        continue;
                    }
                    try
                    {
                        int iteration = 0;
                        returnCode = 0x00000105;
                        while (returnCode == 0x00000105 && UserEnumerated < MaximumNumber)
                        {
                            Trace.WriteLine("SamrEnumerateUsersInDomain iteration " + iteration++);
                            returnCode = sam.SamrEnumerateUsersInDomain(DomainHandle, ref enumerationContextUser, 0, out EnumerationBuffer, 10000, out UserCount);
                            if ((returnCode == 0 || returnCode == 0x00000105) && EnumerationBuffer != null)
                            {
                                for (int j = 0; j < EnumerationBuffer.Length && UserEnumerated++ < MaximumNumber; j++)
                                {
                                    Trace.WriteLine("User:"******"SamrEnumerateUsersInDomain " + returnCode);
                    }
                    finally
                    {
                        sam.SamrCloseHandle(ref DomainHandle);
                    }
                }
            }
            finally
            {
                sam.SamrCloseHandle(ref ServerHandle);
            }
            Trace.WriteLine("EnumerateAccountUsingSamr done");
            return(UserEnumerated > 0);
        }