示例#1
0
        public DOMAIN_PASSWORD_INFORMATION GetDomainPasswordInformation(SecurityIdentifier domainSid)
        {
            if (domainSid == null)
            {
                throw new ArgumentNullException(nameof(domainSid));
            }

            var sid = new byte[domainSid.BinaryLength];

            domainSid.GetBinaryForm(sid, 0);

            Check(Samlib.SamOpenDomain(_handle, DOMAIN_ACCESS_MASK.DOMAIN_READ_PASSWORD_PARAMETERS, sid, out IntPtr domain));
            var info = IntPtr.Zero;

            try
            {
                Check(Samlib.SamQueryInformationDomain(domain, DOMAIN_INFORMATION_CLASS.DomainPasswordInformation, out info));
                return((DOMAIN_PASSWORD_INFORMATION)Marshal.PtrToStructure(info, typeof(DOMAIN_PASSWORD_INFORMATION)));
            }
            finally
            {
                Samlib.SamFreeMemory(info);
                Samlib.SamCloseHandle(domain);
            }
        }
示例#2
0
        public void SetDomainPasswordInformation(SecurityIdentifier domainSid, DOMAIN_PASSWORD_INFORMATION passwordInformation)
        {
            if (domainSid == null)
            {
                throw new ArgumentNullException(nameof(domainSid));
            }

            var sid = new byte[domainSid.BinaryLength];

            domainSid.GetBinaryForm(sid, 0);

            Check(Samlib.SamOpenDomain(_handle, DOMAIN_ACCESS_MASK.DOMAIN_WRITE_PASSWORD_PARAMS, sid, out IntPtr domain));
            IntPtr info = Marshal.AllocHGlobal(Marshal.SizeOf(passwordInformation));

            Marshal.StructureToPtr(passwordInformation, info, false);
            try
            {
                Check(Samlib.SamSetInformationDomain(domain, DOMAIN_INFORMATION_CLASS.DomainPasswordInformation, info));
            }
            finally
            {
                Marshal.FreeHGlobal(info);
                Samlib.SamCloseHandle(domain);
            }
        }
示例#3
0
 public void Dispose()
 {
     if (_handle != IntPtr.Zero)
     {
         Samlib.SamCloseHandle(_handle);
         _handle = IntPtr.Zero;
     }
 }
示例#4
0
        public SecurityIdentifier GetDomainSid(string domain)
        {
            if (domain == null)
            {
                throw new ArgumentNullException(nameof(domain));
            }

            Check(Samlib.SamLookupDomainInSamServer(_handle, new UNICODE_STRING(domain), out IntPtr sid));
            return(new SecurityIdentifier(sid));
        }
示例#5
0
        public IEnumerable <string> EnumerateDomains()
        {
            int cookie = 0;

            while (true)
            {
                var status = Samlib.SamEnumerateDomainsInSamServer(_handle, ref cookie, out IntPtr info, 1, out int count);
                if (status != NTSTATUS.STATUS_SUCCESS && status != NTSTATUS.STATUS_MORE_ENTRIES)
                {
                    Check(status);
                }

                if (count == 0)
                {
                    break;
                }

                var us = (UNICODE_STRING)Marshal.PtrToStructure(info + IntPtr.Size, typeof(UNICODE_STRING));
                Samlib.SamFreeMemory(info);
                yield return(us.ToString());

                us.Buffer = IntPtr.Zero; // we don't own this one
            }
        }
示例#6
0
 public SamServer(string name, SERVER_ACCESS_MASK access)
 {
     Name = name;
     Check(Samlib.SamConnect(new UNICODE_STRING(name), out _handle, access, IntPtr.Zero));
 }