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