コード例 #1
0
        public Sid[] GetMembers()
        {
            NtStatus status;
            IntPtr   members;
            int      count;

            if ((status = Win32.SamGetMembersInAlias(
                     this,
                     out members,
                     out count
                     )) >= NtStatus.Error)
            {
                Win32.Throw(status);
            }

            using (var membersAlloc = new SamMemoryAlloc(members))
            {
                Sid[] sids = new Sid[count];

                for (int i = 0; i < sids.Length; i++)
                {
                    sids[i] = new Sid(membersAlloc.ReadIntPtr(0, i));
                }

                return(sids);
            }
        }
コード例 #2
0
        public string[] LookupIds(int[] relativeIds, out SidNameUse[] uses)
        {
            NtStatus status;
            IntPtr   names;
            IntPtr   use;

            if ((status = Win32.SamLookupIdsInDomain(
                     this,
                     relativeIds.Length,
                     relativeIds,
                     out names,
                     out use
                     )) >= NtStatus.Error)
            {
                Win32.Throw(status);
            }

            using (var namesAlloc = new SamMemoryAlloc(names))
                using (var useAlloc = new SamMemoryAlloc(use))
                {
                    string[]     nameArray = new string[relativeIds.Length];
                    SidNameUse[] useArray  = new SidNameUse[relativeIds.Length];

                    for (int i = 0; i < relativeIds.Length; i++)
                    {
                        nameArray[i] = namesAlloc.ReadStruct <UnicodeString>(i).Read();
                        useArray[i]  = (SidNameUse)useAlloc.ReadInt32(0, i);
                    }

                    uses = useArray;

                    return(nameArray);
                }
        }
コード例 #3
0
        public int[] GetAliasMembership(Sid sid)
        {
            NtStatus status;
            IntPtr   aliases;
            int      count;

            if ((status = Win32.SamGetAliasMembership(
                     this,
                     1,
                     new IntPtr[] { sid },
                     out count,
                     out aliases
                     )) >= NtStatus.Error)
            {
                Win32.Throw(status);
            }

            if (aliases != IntPtr.Zero)
            {
                using (var aliasesAlloc = new SamMemoryAlloc(aliases))
                    return(aliasesAlloc.ReadInt32Array(0, count));
            }
            else
            {
                return(new int[0]);
            }
        }
コード例 #4
0
        public string[] LookupIds(int[] relativeIds, out SidNameUse[] uses)
        {
            IntPtr names;
            IntPtr use;

            Win32.SamLookupIdsInDomain(
                this,
                relativeIds.Length,
                relativeIds,
                out names,
                out use
                ).ThrowIf();

            using (SamMemoryAlloc namesAlloc = new SamMemoryAlloc(names))
                using (SamMemoryAlloc useAlloc = new SamMemoryAlloc(use))
                {
                    string[]     nameArray = new string[relativeIds.Length];
                    SidNameUse[] useArray  = new SidNameUse[relativeIds.Length];

                    for (int i = 0; i < relativeIds.Length; i++)
                    {
                        nameArray[i] = namesAlloc.ReadStruct <UnicodeString>(0, UnicodeString.SizeOf, i).Text;
                        useArray[i]  = (SidNameUse)useAlloc.ReadInt32(0, i);
                    }

                    uses = useArray;

                    return(nameArray);
                }
        }
コード例 #5
0
        public Sid LookupDomain(string name)
        {
            NtStatus      status;
            UnicodeString nameStr;
            IntPtr        domainId;

            nameStr = new UnicodeString(name);

            try
            {
                if ((status = Win32.SamLookupDomainInSamServer(
                         this,
                         ref nameStr,
                         out domainId
                         )) >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }
            }
            finally
            {
                nameStr.Dispose();
            }

            using (var domainIdAlloc = new SamMemoryAlloc(domainId))
                return(new Sid(domainIdAlloc));
        }
コード例 #6
0
        public void EnumDomains(EnumDomainsDelegate callback)
        {
            int    enumerationContext = 0;
            IntPtr buffer;
            int    count;

            while (true)
            {
                Win32.SamEnumerateDomainsInSamServer(
                    this,
                    ref enumerationContext,
                    out buffer,
                    0x100,
                    out count
                    ).ThrowIf();

                if (count == 0)
                {
                    break;
                }

                using (SamMemoryAlloc bufferAlloc = new SamMemoryAlloc(buffer))
                {
                    for (int i = 0; i < count; i++)
                    {
                        SamSidEnumeration data = bufferAlloc.ReadStruct <SamSidEnumeration>(0, SamSidEnumeration.SizeOf, i);

                        if (!callback(data.Name.Text))
                        {
                            return;
                        }
                    }
                }
            }
        }
コード例 #7
0
        public Sid GetSid(int relativeId)
        {
            IntPtr sid;

            Win32.SamRidToSid(
                this,
                relativeId,
                out sid
                ).ThrowIf();

            using (SamMemoryAlloc sidAlloc = new SamMemoryAlloc(sid))
                return(new Sid(sidAlloc));
        }
コード例 #8
0
        public int[] LookupNames(string[] names, out SidNameUse[] uses)
        {
            NtStatus status;

            UnicodeString[] nameStr;
            IntPtr          relativeIds;
            IntPtr          use;

            nameStr = new UnicodeString[names.Length];

            for (int i = 0; i < names.Length; i++)
            {
                nameStr[i] = new UnicodeString(names[i]);
            }

            try
            {
                if ((status = Win32.SamLookupNamesInDomain(
                         this,
                         names.Length,
                         nameStr,
                         out relativeIds,
                         out use
                         )) >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }
            }
            finally
            {
                for (int i = 0; i < names.Length; i++)
                {
                    nameStr[i].Dispose();
                }
            }

            using (var relativeIdsAlloc = new SamMemoryAlloc(relativeIds))
                using (var useAlloc = new SamMemoryAlloc(use))
                {
                    SidNameUse[] useArray = new SidNameUse[names.Length];

                    for (int i = 0; i < names.Length; i++)
                    {
                        useArray[i] = (SidNameUse)useAlloc.ReadInt32(0, i);
                    }

                    uses = useArray;

                    return(relativeIdsAlloc.ReadInt32Array(0, names.Length));
                }
        }
コード例 #9
0
        public DomainPasswordPolicy GetPasswordPolicy()
        {
            using (SamMemoryAlloc data = this.GetInformation(DomainInformationClass.DomainPasswordInformation))
            {
                DomainPasswordInformation info = data.ReadStruct <DomainPasswordInformation>();

                return(new DomainPasswordPolicy(
                           info.MinPasswordLength,
                           info.PasswordHistoryLength,
                           info.PasswordProperties,
                           new TimeSpan(-info.MaxPasswordAge),
                           new TimeSpan(-info.MinPasswordAge)
                           ));
            }
        }
コード例 #10
0
        public Sid GetSid(int relativeId)
        {
            NtStatus status;
            IntPtr   sid;

            if ((status = Win32.SamRidToSid(
                     this,
                     relativeId,
                     out sid
                     )) >= NtStatus.Error)
            {
                Win32.Throw(status);
            }

            using (var sidAlloc = new SamMemoryAlloc(sid))
                return(new Sid(sidAlloc));
        }
コード例 #11
0
        public int[] GetGroups()
        {
            NtStatus status;
            IntPtr   groups;
            int      count;

            if ((status = Win32.SamGetGroupsForUser(
                     this,
                     out groups,
                     out count
                     )) >= NtStatus.Error)
            {
                Win32.Throw(status);
            }

            using (var groupsAlloc = new SamMemoryAlloc(groups))
            {
                return(groupsAlloc.ReadInt32Array(0, count));
            }
        }
コード例 #12
0
        public void EnumUsers(EnumUsersDelegate callback, UserAccountFlags flags)
        {
            NtStatus status;
            int      enumerationContext = 0;
            IntPtr   buffer;
            int      count;

            while (true)
            {
                status = Win32.SamEnumerateUsersInDomain(
                    this,
                    ref enumerationContext,
                    flags,
                    out buffer,
                    0x100,
                    out count
                    );

                if (status >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }
                if (count == 0)
                {
                    break;
                }

                using (var bufferAlloc = new SamMemoryAlloc(buffer))
                {
                    for (int i = 0; i < count; i++)
                    {
                        var data = bufferAlloc.ReadStruct <SamRidEnumeration>(i);

                        if (!callback(data.Name.Read(), data.RelativeId))
                        {
                            return;
                        }
                    }
                }
            }
        }
コード例 #13
0
        public int[] GetAliasMembership(Sid sid)
        {
            IntPtr aliases;
            int    count;

            Win32.SamGetAliasMembership(
                this,
                1,
                new IntPtr[] { sid },
                out count,
                out aliases
                ).ThrowIf();

            if (aliases != IntPtr.Zero)
            {
                using (var aliasesAlloc = new SamMemoryAlloc(aliases))
                    return(aliasesAlloc.ReadInt32Array(0, count));
            }

            return(new int[0]);
        }
コード例 #14
0
        public void EnumDomains(EnumDomainsDelegate callback)
        {
            NtStatus status;
            int      enumerationContext = 0;
            IntPtr   buffer;
            int      count;

            while (true)
            {
                status = Win32.SamEnumerateDomainsInSamServer(
                    this,
                    ref enumerationContext,
                    out buffer,
                    0x100,
                    out count
                    );

                if (status >= NtStatus.Error)
                {
                    Win32.Throw(status);
                }
                if (count == 0)
                {
                    break;
                }

                using (var bufferAlloc = new SamMemoryAlloc(buffer))
                {
                    for (int i = 0; i < count; i++)
                    {
                        var data = bufferAlloc.ReadStruct <SamSidEnumeration>(i);

                        if (!callback(data.Name.Read()))
                        {
                            return;
                        }
                    }
                }
            }
        }
コード例 #15
0
        public Sid LookupDomain(string name)
        {
            IntPtr domainId;

            UnicodeString nameStr = new UnicodeString(name);

            try
            {
                Win32.SamLookupDomainInSamServer(
                    this,
                    ref nameStr,
                    out domainId
                    ).ThrowIf();
            }
            finally
            {
                nameStr.Dispose();
            }

            using (var domainIdAlloc = new SamMemoryAlloc(domainId))
                return(new Sid(domainIdAlloc));
        }
コード例 #16
0
        public int[] GetMembers()
        {
            NtStatus status;
            IntPtr   memberIds;
            IntPtr   attributes;
            int      count;

            if ((status = Win32.SamGetMembersInGroup(
                     this,
                     out memberIds,
                     out attributes,
                     out count
                     )) >= NtStatus.Error)
            {
                Win32.Throw(status);
            }

            using (var memberIdsAlloc = new SamMemoryAlloc(memberIds))
                using (var attributesAlloc = new SamMemoryAlloc(attributes))
                {
                    return(memberIdsAlloc.ReadInt32Array(0, count));
                }
        }
コード例 #17
0
        public void EnumUsers(EnumUsersDelegate callback, UserAccountFlags flags)
        {
            int    enumerationContext = 0;
            IntPtr buffer;
            int    count;

            while (true)
            {
                Win32.SamEnumerateUsersInDomain(
                    this,
                    ref enumerationContext,
                    flags,
                    out buffer,
                    0x100,
                    out count
                    ).ThrowIf();

                if (count == 0)
                {
                    break;
                }

                using (SamMemoryAlloc bufferAlloc = new SamMemoryAlloc(buffer))
                {
                    for (int i = 0; i < count; i++)
                    {
                        var data = bufferAlloc.ReadStruct <SamRidEnumeration>(0, SamRidEnumeration.SizeOf, i);

                        if (!callback(data.Name.Text, data.RelativeId))
                        {
                            return;
                        }
                    }
                }
            }
        }