[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