Attach to the ASPNET app and break on this code to see which user you're
running as.

--
Ernst Kuschke
MVP - C# (South Africa)
http://www.ernstkuschke.com

On 11/29/06, Dimitrios Toulakis <[EMAIL PROTECTED]> wrote:

Hi,

but I am setting explicit the user in ImpersonateUser(..).
And this user has full access to the AD.

Otherwise I would not do that step.....

Here is how the Impersonate class looks like:


using System;
using System.Web;
using System.Security.Principal;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;

namespace EnterpriseUtilities
{
        /// <summary>
        /// used for connecting to other Logon Providers
        /// </summary>
        public enum LogonProvider
        {
                LOGON32_PROVIDER_DEFAULT                = 0,
                LOGON32_PROVIDER_WINNT40                = 2,
                LOGON32_PROVIDER_WINNT50                = 3
        }

        /// <summary>
        /// Used to change the level of impersonation on remote systems
        /// </summary>
        public enum ImpersonationLevel
        {
                SecurityAnonymous = 0,
                SecurityIdentification,
                SecurityImpersonation,
                SecurityDelegation
        }

        public enum LogonTypes
        {
                //logon types
                LOGON32_LOGON_INTERACTIVE               = 2,
                LOGON32_LOGON_NETWORK                   = 3,
                LOGON32_LOGON_BATCH                     = 4,

                // Windows2000
                LOGON32_LOGON_NETWORK_CLEARPASSWORD     = 8,
                LOGON32_LOGON_NEW_CREDENTIALS           = 9
        }

        /// <summary>
        /// Impersonate a specific user in the domain.
        /// Note that the user account on the calling process must have
        /// the SE_TCB_NAME priviledge when running on W2k.
        /// This can be given using Local Policy MMC and adding account to
        /// "Act as Part of the Operationg System".  For ASP.NETapplications 
the calling
        /// user context is usually ASPNET user.
        /// </summary>
        public class Impersonate
        {
                #region Dll Imports
                [DllImport("advapi32.dll", CharSet=CharSet.Auto,
SetLastError=true)]
                public static extern bool LogonUser(String lpszUsername,
String lpszDomain, String lpszPassword,
                        int dwLogonType, int dwLogonProvider, ref IntPtr
phToken);

                [DllImport("advapi32.dll", CharSet=CharSet.Auto,
SetLastError=true)]
                public extern static bool DuplicateToken(IntPtr hToken,
int impersonationLevel, ref IntPtr hNewToken);

                [DllImport("kernel32.dll", CharSet=CharSet.Auto,
SetLastError=true)]
                public static extern bool CloseHandle(IntPtr handle);

                [DllImport("advapi32.dll", SetLastError=true)]
                public static extern int ImpersonateLoggedOnUser(IntPtr
hToken);

                [DllImport("advapi32.dll", SetLastError=true)]
                static extern int RevertToSelf();
                #endregion

                #region MEMBER VARIABLES
                private IntPtr token = IntPtr.Zero;
                private IntPtr dupToken = IntPtr.Zero;
                private LogonProvider _logonProvider;
                private ImpersonationLevel _impersonationLevel;
                private string _originalUser =
Thread.CurrentPrincipal.Identity.Name;
                private LogonTypes _logonType;
                private bool impersonated = false;
                #endregion

                #region CONTRUCTORS
                public Impersonate(LogonProvider logonProvider,
ImpersonationLevel level, LogonTypes logonType)
                {
                        this._logonProvider = logonProvider;
                        this._impersonationLevel = level;
                        this._logonType = logonType;
                }

                public Impersonate(LogonProvider logonProvider,
ImpersonationLevel level) : this (logonProvider, level,
LogonTypes.LOGON32_LOGON_NETWORK) {}

                public Impersonate(LogonProvider logonProvider) : this
(logonProvider, ImpersonationLevel.SecurityImpersonation,
LogonTypes.LOGON32_LOGON_NETWORK) {}

                public Impersonate() : this(
LogonProvider.LOGON32_PROVIDER_DEFAULT,
ImpersonationLevel.SecurityImpersonation, LogonTypes.LOGON32_LOGON_NETWORK)
{}

                #endregion

                #region PUBLIC PROPERTIES

                public ImpersonationLevel Level
                {
                        get { return this._impersonationLevel; }
                        set { this._impersonationLevel = value; }
                }

                public LogonTypes LogonType
                {
                        get { return this._logonType; }
                        set { this._logonType = value; }
                }

                public string CurrentIdentity
                {
                        get
                        {
                                return
Thread.CurrentPrincipal.Identity.Name;
                        }
                }

                /// <summary>
                /// Property returns whether or not an impersonation is
occurring
                /// </summary>
                public bool Impersonating
                {
                        get
                        {
                                return this.CurrentIdentity !=
this._originalUser;
                        }
                }

                #endregion

                #region PUBLIC METHODS
                /// <summary>
                /// Impersonates a specific user in the domain.  This
changes the process
                /// identity to the impersonated user's security context.
                /// </summary>
                /// <param name="domain">Domain name</param>
                /// <param name="username">Login ID</param>
                /// <param name="password">Password</param>
                public void ImpersonateUser(string domain, string
username, string password)
                {
                        ImpersonateUser(domain, username, password,
false);
                }
                /// <summary>
                /// Impersonates a specific user in the domain.  This
changes the process
                /// identity to the impersonated user's security context.
                /// </summary>
                /// <param name="domain">Domain name</param>
                /// <param name="username">Login ID</param>
                /// <param name="password">Password</param>
                /// <param name="justLogon">Do not process
impersonisation.</param>
                public void ImpersonateUser(string domain, string
username, string password, bool justLogon)
                {
                        if (Impersonating) throw new
System.Security.SecurityException("You are already impersonating " +
CurrentIdentity);

                        impersonated = LogonUser(username,
                                domain,
                                password,
                                (int)_logonType,
                                (int)_logonProvider,
                                ref token);

                        //check the error
                        if(!impersonated) throw new Win32Exception(
Marshal.GetLastWin32Error());

                        if (!justLogon) ImpersonateLoggedOnUser(token);
                }

                /// <summary>
                /// Reverts back to the original process identity.
                /// </summary>
                public void UndoImpersonation()
                {
                        if (impersonated) RevertToSelf();
                        if (token != IntPtr.Zero) CloseHandle(token);
                        if (dupToken != IntPtr.Zero)
CloseHandle(dupToken);
                }
                #endregion
        }
}


At the end of the Impersonate(...) method I would expect to have the
privileged user.


Dimitrios


>Dimitrios:
>
>>                               im.ImpersonateUser(User.DOMAIN,
AD_ACCOUNT,
>AD_ACCOUNT_PASSWORD, true);
>
>In ASP.Net, it will be the IIS user, which perhaps has no privilege to
the
>AD.
>
>HTH
>
>- Adwait
>
>--
>Adwait Ullal
>
>e: mailto:[EMAIL PROTECTED]
>w: http://www.adwait.com
>l: http://www.linkedin.com/in/adwait
>j: http://finance.groups.yahoo.com/group/AdwaitsDotNetJobs
>
>
>On 11/29/06, Toulakis, Dimitrios (RESC) <
[EMAIL PROTECTED]>
>wrote:
>>
>> Hi all,
>>
>> got a strange behaviour with a piece of code which is creating user
>> accounts on the active directory.
>>
>> The code looks like this:
>>
>>                public bool CreateUser(string userId, string
>> lookupDomain, ContactEntity contact)
>>                {
>>                        string path = string.Format( "{0}://{1}",
>> PROVIDER_LDAP, lookupDomain);
>>
>>                        //the impersonate class wraps around the
>> "advapi32.dll"
>>                        //to get the impersonisation token
>>                        Impersonate im = new Impersonate();
>>
>>                        bool score = true;
>>
>>                        Hashtable hash = GetUsers(lookupDomain);
>>
>>                        int counter = 0;
>>                        string originalId = userId;
>>
>>                        while(hash.Contains(userId))
>>                                userId = originalId +
>> counter.ToString();
>>
>>
>>                        try
>>                        {
>>                                DirectoryEntry de = new
>> DirectoryEntry(path, AD_ACCOUNT, AD_ACCOUNT_PASSWORD,
>> AuthenticationTypes.Secure);
>>
>>                                im.ImpersonateUser(User.DOMAIN,
>> AD_ACCOUNT, AD_ACCOUNT_PASSWORD, true);
>>
>>                                DirectoryEntry user =
>> de.Children.Add("CN=" + userId, "user");
>>
>>                                user.Properties["sAMAccountName"].Value
>> = userId;
>>
>>                        user.Properties["userAccountControl"].Value =
>> ActiveDs.ADS_USER_FLAG.ADS_UF_NORMAL_ACCOUNT
>>                                        |
>> ActiveDs.ADS_USER_FLAG.ADS_UF_PASSWD_NOTREQD
>>                                        |
>> ActiveDs.ADS_USER_FLAG.ADS_UF_DONT_EXPIRE_PASSWD;
>>
>>                                user.CommitChanges();
>>                                user.Invoke("SetPassword", new object[]
>> {DEFAULT_AD_PASSWORD});
>>
>>                                hash.Add(userId, userId);
>>
>>                                UpdateUsers(lookupDomain, hash);
>>                        }
>>                        catch(Exception ex)
>>                        {
>>                                ex.GetHashCode();
>>                                score = false;
>>                        }
>>                        finally
>>                        {
>>                                im.UndoImpersonation();
>>                        }
>>
>>                        return score;
>>
>>                }
>>
>>
>> Using this piece of code in an Windows Forms application works fine.
>> But when using it in an ASP.NET application it fails.
>>
>> The error message is:
>>
>> Logon failure: unknown user name or bad password
>>
>> This is strange to me because with the same credentials I am able to
get
>> all the domain user accounts (within the ASP.NET application).
>>
>> So, I am currently running out of ideas...
>>
>> Any suggestions?
>>
>>
>>
>>
>> Met vriendelijke groet / With kind regards,
>>
>> Dimitrios Toulakis
>>
>> Postbus 1010
>> 3600 BA Maarssen/Amsterdam
>> The Netherlands
>>
>> Tel : +31(0) 346 583300
>> Fax: +31(0) 346 583399
>> URL: http://www.resourcesconnection.nl
>> <http://www.resourcesconnection.nl/>
>> E-mail disclaimer: http://www.resourcesconnection.nl/e-maildisclaimer
>> <http://www.resourcesconnection.nl/e-maildisclaimer>
>>
>> ===================================
>> This list is hosted by DevelopMentor(r)  http://www.develop.com
>>
>> View archives and manage your subscription(s) at
>> http://discuss.develop.com
>>
>
>===================================
>This list is hosted by DevelopMentor(r)  http://www.develop.com
>
>View archives and manage your subscription(s) at
http://discuss.develop.com

===================================
This list is hosted by DevelopMentor�  http://www.develop.com

View archives and manage your subscription(s) at
http://discuss.develop.com

Reply via email to