Esempio n. 1
0
        private static DsNameResultItem[] CrackNames(
            SafeDsHandle hDS,
            DsNameFlags flags,
            DsNameFormat formatOffered,
            DsNameFormat formatDesired,
            string[] names)
        {
            PscxArgumentException.ThrowIfIsNullOrEmpty(names);

            IntPtr ptr = IntPtr.Zero;

            try
            {
                NativeMethods.EnforceSuccess(NativeMethods.DsCrackNames(
                                                 hDS,
                                                 flags,
                                                 formatOffered,
                                                 formatDesired,
                                                 names.Length,
                                                 names,
                                                 out ptr));

                DsNameResult result = Utils.PtrToStructure <DsNameResult>(ptr);

                IEnumerable <DsNameResultItem> items =
                    Utils.ReadNativeArray <DsNameResultItem>(result.rItems, result.cItems);

                return(new List <DsNameResultItem>(items).ToArray());
            }
            finally
            {
                NativeMethods.DsFreeNameResult(ptr);
            }
        }
Esempio n. 2
0
 public static extern uint DsCrackNames(
     SafeDsHandle hSafeDs,
     DS_NAME_FLAGS flags,
     DS_NAME_FORMAT formatOffered,
     DS_NAME_FORMAT formatDesired,
     uint cNames,
     [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPTStr, SizeParamIndex = 4)] string[] rpNames,
     out IntPtr ppResult);
Esempio n. 3
0
        // Creates a spn if the user hasn't specified one.
        public static string Make()
        {
            uint         ulSpn        = 1;
            var          lpCompDN     = new StringBuilder(128);
            var          ulCompDNSize = (uint)lpCompDN.Capacity;
            var          NoFailure    = true;
            SafeDsHandle hDS          = SafeDsHandle.Null;

            Win32Error status = DsGetSpn(DS_SPN_NAME_TYPE.DS_SPN_NB_HOST, "hello",
Esempio n. 4
0
        public void DsBindTest(bool validUser, bool validCred, string urn, string dn, string dcn, string domain, string un, string pwd, string notes)
        {
            SafeDsHandle dsb = null;

            Assert.That(() => { using (dsb = new SafeDsHandle()) Assert.That(dsb.IsInvalid, Is.False); }, Throws.Nothing);
            Assert.That(() => { using (dsb = new SafeDsHandle(dn, dcn)) Assert.That(dsb.IsInvalid, Is.EqualTo(!validUser)); }, validUser ? (IResolveConstraint) new ThrowsNothingConstraint() : new ThrowsExceptionConstraint());
            Assert.That(() => { using (dsb = new SafeDsHandle(dn, null)) Assert.That(dsb.IsInvalid, Is.EqualTo(!validUser)); }, validUser ? (IResolveConstraint) new ThrowsNothingConstraint() : new ThrowsExceptionConstraint());
            Assert.That(() => { using (dsb = new SafeDsHandle(null, dcn)) Assert.That(dsb.IsInvalid, Is.EqualTo(!validUser)); }, validUser ? (IResolveConstraint) new ThrowsNothingConstraint() : new ThrowsExceptionConstraint());
            Assert.That(dsb?.IsInvalid ?? true);
        }
Esempio n. 5
0
        public static DS_NAME_RESULT_ITEM[] DsCrackNames(SafeDsHandle hSafeDs, string[] names,
                                                         DS_NAME_FORMAT formatDesired = DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME,
                                                         DS_NAME_FORMAT formatOffered = DS_NAME_FORMAT.DS_UNKNOWN_NAME,
                                                         DS_NAME_FLAGS flags          = DS_NAME_FLAGS.DS_NAME_NO_FLAGS)
        {
            var err = DsCrackNames(hSafeDs, flags, formatOffered, formatDesired, (uint)(names?.Length ?? 0), names, out SafeDsNameResult pResult);

            new Win32Error((int)err).ThrowIfFailed();
            return(pResult.Items);
        }
Esempio n. 6
0
 public void DsCrackNamesTest(bool validUser, bool validCred, string urn, string dn, string dc, string domain, string un, string pwd, string notes)
 {
     using (var dsb = new SafeDsHandle())
     {
         var res = DsCrackNames(dsb, new[] { un }, DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME);
         Assert.That(res, Has.Exactly(1).Items);
         //Assert.That(res[0].ToString(), Is.EqualTo(o));
         for (var i = 0; i < res.Length; i++)
         {
             TestContext.WriteLine($"{i}) {res[i]}");
         }
     }
 }
Esempio n. 7
0
        public void DsBindWithCredTest(bool validUser, bool validCred, string urn, string dn, string dc, string domain, string un, string pwd, string notes)
        {
            void Meth()
            {
                SafeDsHandle dsb;

                using (var cred = new SafeDsPasswordCredentialsHandle(un, dn, pwd))
                    using (dsb = new SafeDsHandle(cred, dn, dc))
                        Assert.That(dsb.IsInvalid, Is.False);
                Assert.That(dsb.IsInvalid);
            }

            if (!validUser || !validCred)
            {
                Assert.That(Meth, Throws.Exception);
            }
            else
            {
                Assert.That(Meth, Throws.Nothing);
            }
        }
Esempio n. 8
0
        /// <summary>A wrapper function for the DsCrackNames OS call</summary>
        /// <param name="hSafeDs">
        /// Contains a directory service handle obtained from either the DSBind or DSBindWithCred function. If flags contains DS_NAME_FLAG_SYNTACTICAL_ONLY, hDS
        /// can be NULL.
        /// </param>
        /// <param name="names">The names to be converted.</param>
        /// <param name="flags">Contains one or m
        /// ore of the DS_NAME_FLAGS values used to determine how the name syntax will be cracked.</param>
        /// <param name="formatOffered">Contains one of the DS_NAME_FORMAT values that identifies the format of the input names.</param>
        /// <param name="formatDesired">
        /// Contains one of the DS_NAME_FORMAT values that identifies the format of the output names. The DS_SID_OR_SID_HISTORY_NAME value is not supported.
        /// </param>
        /// <returns>The crack results.</returns>
        public static IEnumerable <DS_NAME_RESULT_ITEM> DsCrackNames(SafeDsHandle hSafeDs, string[] names = null,
                                                                     DS_NAME_FLAGS flags          = DS_NAME_FLAGS.DS_NAME_NO_FLAGS,
                                                                     DS_NAME_FORMAT formatOffered = DS_NAME_FORMAT.DS_NT4_ACCOUNT_NAME,
                                                                     DS_NAME_FORMAT formatDesired = DS_NAME_FORMAT.DS_USER_PRINCIPAL_NAME)
        {
            IntPtr pResult;
            var    err = DsCrackNames(hSafeDs, flags, formatOffered, formatDesired, (uint)(names?.Length ?? 0), names, out pResult);

            if (err != NO_ERROR)
            {
                throw new Win32Exception((int)err);
            }
            try
            {
                return(pResult.ToStructure <DS_NAME_RESULT>().Items);
            }
            finally
            {
                DsFreeNameResult(pResult);
            }
        }
Esempio n. 9
0
        public string CanonicalToDistinguishedName(string cn)
        {
            using (SafeDsCredentialsHandle cred = MakeCredentials())
            {
                using (SafeDsHandle handle = Bind(cred))
                {
                    DsNameResultItem[] items = CrackNames(
                        handle,
                        DsNameFlags.None,
                        DsNameFormat.CanonicalName,
                        DsNameFormat.DistinguishedName,
                        new string[] { cn });

                    foreach (DsNameResultItem item in items)
                    {
                        return(item.pName);
                    }
                }
            }

            return(null);
        }
Esempio n. 10
0
        private static int TryBind(string server, string domain, SafeDsCredentialsHandle credentials, out SafeDsHandle handle)
        {
            if (credentials != null)
            {
                return(NativeMethods.DsBindWithCred(server, domain, credentials, out handle));
            }

            return(NativeMethods.DsBind(server, domain, out handle));
        }