Groups | Blog | Home
all groups > dotnet clr > december 2005 >

dotnet clr : Impersonation question for network resources


Ben Fidge
12/13/2005 3:58:02 AM
Hi

I have a small WinForms app that needs to copy files from a shared drive on
a network. If I connect to the mapped drive using Explorer, a password dialog
pops-up and I have to provide credentials with permission to access this
resource on the machine where it's hosted. This is once for each desktop
logon session (ie after every reboot). If I do this, my app can access the
network resource fine, but otherwise fails with permission errors.

As my app runs when Windows starts, I don't want to first connect to the
mapped drive each and every time.

I've found some C# code that allows me to impersonate a
domain/account/password context, but it won't work in the scenario I want. I
know the code works because it allows me to impersonate local accounts, just
not access the network resource. When run, the following error occurs:

"Error No: 1326 - Error: Logon failure: unknown user name or bad password."

However, I know the domain/account/password are all correct.

The code is based on Win32 API's LogonUser. Am I barking up the wrong tree?

Thanks

Martin Kulov
12/16/2005 12:43:08 AM
Hi Ben,

Some code sample will be very usefull.

Best,
Martin


[quoted text, click to view]
Ben Fidge
12/16/2005 4:00:02 AM
Hi Martin,

Here's the code I'm using. Please note that the Win32 API calls are wrapped
up in a static class called Impersonation:

IntPtr pWindowsIdentity = IntPtr.Zero;
int iResult = Impersonation.LogonUser("MyAccount",
"MyDomain", "MyPassword", Impersonation.LOGON32_LOGON_INTERACTIVE,
Impersonation.LOGON32_PROVIDER_DEFAULT, ref pWindowsIdentity);

if (iResult == 0 && pWindowsIdentity != IntPtr.Zero) {
WindowsIdentity oNewWI = new WindowsIdentity(pWindowsIdentity);
Impersonation.CloseHandle(pWindowsIdentity);

WindowsImpersonationContext oWIC = oNewWI.Impersonate();

// .... Do code to access network resource here


oWIC.Undo();
}
else {
int iError = Impersonation.GetLastError();
throw new Exception(string.Format("Could not logon user using credentials
provided. Error No: {0} - Error: {1}", iError,
Impersonation.CreateLogonUserError(iError)));
}


Regards

Ben

[quoted text, click to view]
Ben Fidge
12/16/2005 5:37:03 AM
Found it!!

First of all, I was assuming that LogonUser returned 0 (zero) on success,
wrongly. Secondly, I changed my code to use LOGON32_LOGON_NEW_CREDENTIALS
instead of LOGON32_LOGON_NETWORK, and it works a treat.

Ben


[quoted text, click to view]
AddThis Social Bookmark Button