[Mono-osx] How to logon to Win or Mac using credentials through code?

d_v dan.vandermolen at figpsoft.com
Thu Jan 22 10:08:38 EST 2009


I should be more specific, besides I have not heard any ideas yet :)

When I say "logon" I really mean that I am trying to copy a file over the
network and I would like to supply the username and password and (domain). 
At this point I don't even know if a Mac requires a domain name...

If you can point me in the right direction I would be grateful. even a
link/bone :)


d_v wrote:
> 
> Does anyone have a good way to logon to Windows and a Mac using
> credentials through code?
> 
> I am using the Impersonator code and am now trying to get it to run on Mac
> 2.2_5 (latest build).
> 
> The error I recieved was:
> 
> System.DllNotFoundException: advapi32.dll
>   at (wrapper managed-to-native) MiscImpersonate.Impersonator:RevertToSelf
> ()
>   at MiscImpersonate.Impersonator.ImpersonateValidUser (System.String
> userName, System.String domain, System.String password) [0x00000] 
>   at MiscImpersonate.Impersonator..ctor (System.String userName,
> System.String domainName, System.String password) [0x00000] 
>   at My_App.Form1.VerifyClientSettings_FileFilter () [0x00000]
> 
> 
> The Impersonator code is from:
> http://www.codeproject.com/KB/cs/zetaimpersonator.aspx
> 
> 
> Here is the Impersonator code in my MiscImpersonate unit in C# for DotNet
> 2.x:
> // *********************************************************
> 
> namespace MiscImpersonate
> {
>     #region Using directives.
>     //
> ----------------------------------------------------------------------
> 
>     using System;
>     using System.Security.Principal;
>     using System.Runtime.InteropServices;
>     using System.ComponentModel;
> 
>     //
> ----------------------------------------------------------------------
>     #endregion
> 
>    
> /////////////////////////////////////////////////////////////////////////
> 
>     /// <summary>
>     /// Impersonation of a user. Allows to execute code under another
>     /// user context.
>     /// Please note that the account that instantiates the Impersonator
> class
>     /// needs to have the 'Act as part of operating system' privilege set.
>     /// </summary>
>     /// <remarks>	
>     /// Download this file:
> http://www.codeproject.com/KB/cs/zetaimpersonator.aspx
>     /// This class is based on the information in the Microsoft knowledge
> base
>     /// article
> http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158
>     /// 
>     /// Encapsulate an instance into a using-directive like e.g.:
>     /// 
>     ///		...
>     ///		using ( new Impersonator( "myUsername", "myDomainname",
> "myPassword" ) )
>     ///		{
>     ///			...
>     ///			[code that executes under the new context]
>     ///			...
>     ///		}
>     ///		...
>     /// 
>     /// Please contact the author Uwe Keim
> (mailto:uwe.keim at zeta-software.de)
>     /// for questions regarding this class.
>     /// </remarks>
>     public class Impersonator :
>         IDisposable
>     {
>         #region Public methods.
>         //
> ------------------------------------------------------------------
> 
>         /// <summary>
>         /// Constructor. Starts the impersonation with the given
> credentials.
>         /// Please note that the account that instantiates the
> Impersonator class
>         /// needs to have the 'Act as part of operating system' privilege
> set.
>         /// </summary>
>         /// The name of the user to act as.
>         /// The domain name of the user to act as.
>         /// The password of the user to act as.
>         public Impersonator(
>             string userName,
>             string domainName,
>             string password)
>         {
>             ImpersonateValidUser(userName, domainName, password);
>         }
> 
>         //
> ------------------------------------------------------------------
>         #endregion
> 
>         #region IDisposable member.
>         //
> ------------------------------------------------------------------
> 
>         public void Dispose()
>         {
>             UndoImpersonation();
>         }
> 
>         //
> ------------------------------------------------------------------
>         #endregion
> 
>         #region P/Invoke.
>         //
> ------------------------------------------------------------------
> 
>         [DllImport("advapi32.dll", SetLastError = true)]
>         private static extern int LogonUser(
>             string lpszUserName,
>             string lpszDomain,
>             string lpszPassword,
>             int dwLogonType,
>             int dwLogonProvider,
>             ref IntPtr phToken);
> 
>         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError =
> true)]
>         private static extern int DuplicateToken(
>             IntPtr hToken,
>             int impersonationLevel,
>             ref IntPtr hNewToken);
> 
>         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError =
> true)]
>         private static extern bool RevertToSelf();
> 
>         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
>         private static extern bool CloseHandle(
>             IntPtr handle);
> 
>         private const int LOGON32_LOGON_INTERACTIVE = 2;
>         private const int LOGON32_PROVIDER_DEFAULT = 0;
> 
>         //
> ------------------------------------------------------------------
>         #endregion
> 
>         #region Private member.
>         //
> ------------------------------------------------------------------
> 
>         /// <summary>
>         /// Does the actual impersonation.
>         /// </summary>
>         /// The name of the user to act as.
>         /// The domain name of the user to act as.
>         /// The password of the user to act as.
>         private void ImpersonateValidUser(
>             string userName,
>             string domain,
>             string password)
>         {
>             WindowsIdentity tempWindowsIdentity = null;
>             IntPtr token = IntPtr.Zero;
>             IntPtr tokenDuplicate = IntPtr.Zero;
> 
>             try
>             {
>                 if (RevertToSelf())
>                 {
>                     if (LogonUser(
>                         userName,
>                         domain,
>                         password,
>                         LOGON32_LOGON_INTERACTIVE,
>                         LOGON32_PROVIDER_DEFAULT,
>                         ref token) != 0)
>                     {
>                         if (DuplicateToken(token, 2, ref tokenDuplicate)
> != 0)
>                         {
>                             tempWindowsIdentity = new
> WindowsIdentity(tokenDuplicate);
>                             impersonationContext =
> tempWindowsIdentity.Impersonate();
>                         }
>                         else
>                         {
>                             throw new
> Win32Exception(Marshal.GetLastWin32Error());
>                         }
>                     }
>                     else
>                     {
>                         throw new
> Win32Exception(Marshal.GetLastWin32Error());
>                     }
>                 }
>                 else
>                 {
>                     throw new Win32Exception(Marshal.GetLastWin32Error());
>                 }
>             }
>             finally
>             {
>                 if (token != IntPtr.Zero)
>                 {
>                     CloseHandle(token);
>                 }
>                 if (tokenDuplicate != IntPtr.Zero)
>                 {
>                     CloseHandle(tokenDuplicate);
>                 }
>             }
>         }
> 
>         /// <summary>
>         /// Reverts the impersonation.
>         /// </summary>
>         private void UndoImpersonation()
>         {
>             if (impersonationContext != null)
>             {
>                 impersonationContext.Undo();
>             }
>         }
> 
>         private WindowsImpersonationContext impersonationContext = null;
> 
>         //
> ------------------------------------------------------------------
>         #endregion
>     }
> 
>    
> /////////////////////////////////////////////////////////////////////////
> }
> 
> 

-- 
View this message in context: http://www.nabble.com/How-to-logon-to-Win-or-Mac-using-credentials-through-code--tp21591295p21606045.html
Sent from the Mono - OSX mailing list archive at Nabble.com.



More information about the Mono-osx mailing list