Пример #1
0
        private static unsafe SEC_WINNT_AUTH_IDENTITY_EX2 *MakeCreds(byte[] keytab, string usernameStr, string domainNameStr)
        {
            var usernameBytes = Encoding.Unicode.GetBytes(usernameStr);
            var domainBytes   = Encoding.Unicode.GetBytes(domainNameStr);

            var size = sizeof(SEC_WINNT_AUTH_IDENTITY_EX2) +
                       sizeof(SEC_WINNT_AUTH_PACKED_CREDENTIALS) +
                       keytab.Length +
                       usernameBytes.Length +
                       domainBytes.Length;

            void *pCreds = SafeAlloc(size);

            SEC_WINNT_AUTH_IDENTITY_EX2 *creds = (SEC_WINNT_AUTH_IDENTITY_EX2 *)pCreds;

            creds->Version           = SEC_WINNT_AUTH_IDENTITY_VERSION_2;
            creds->cbHeaderLength    = (ushort)Marshal.SizeOf <SEC_WINNT_AUTH_IDENTITY_EX2>();
            creds->cbStructureLength = (uint)size;

            SEC_WINNT_AUTH_PACKED_CREDENTIALS *packedCreds = (SEC_WINNT_AUTH_PACKED_CREDENTIALS *)PtrIncrement(creds, creds->cbHeaderLength);

            packedCreds->cbHeaderLength    = (ushort)Marshal.SizeOf <SEC_WINNT_AUTH_PACKED_CREDENTIALS>();
            packedCreds->cbStructureLength = (ushort)(packedCreds->cbHeaderLength + keytab.Length);

            packedCreds->AuthData.CredType = SEC_WINNT_AUTH_DATA_TYPE_KEYTAB;
            packedCreds->AuthData.CredData.ByteArrayLength = (ushort)keytab.Length;
            packedCreds->AuthData.CredData.ByteArrayOffset = (ushort)Marshal.SizeOf <SEC_WINNT_AUTH_PACKED_CREDENTIALS>();

            creds->PackedCredentialsOffset = (uint)Marshal.SizeOf <SEC_WINNT_AUTH_IDENTITY_EX2>();
            creds->PackedCredentialsLength = packedCreds->cbStructureLength;

            Marshal.Copy(
                keytab,
                0,
                PtrIncrement(packedCreds, packedCreds->cbHeaderLength),
                keytab.Length
                );

            creds->UserOffset = creds->PackedCredentialsOffset + creds->PackedCredentialsLength;
            creds->UserLength = (ushort)usernameBytes.Length;

            Marshal.Copy(
                usernameBytes,
                0,
                PtrIncrement(creds, creds->UserOffset),
                creds->UserLength
                );

            creds->DomainOffset = creds->UserOffset + creds->UserLength;
            creds->DomainLength = (ushort)domainBytes.Length;

            Marshal.Copy(
                domainBytes,
                0,
                PtrIncrement(creds, creds->DomainOffset),
                creds->DomainLength
                );

            return(creds);
        }
        public unsafe void DebugStructure()
        {
#if DEBUG
            if (!IsInvalid)
            {
                SEC_WINNT_AUTH_IDENTITY_EX2 *creds = (SEC_WINNT_AUTH_IDENTITY_EX2 *)handle;
                DebugStructure((byte *)creds, creds->cbStructureLength);
            }
#endif
        }