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] "Martin Kulov" wrote:
> Hi Ben,
>
> Some code sample will be very usefull.
>
> Best,
> Martin
>
>
> "Ben Fidge" <BenFidge@discussions.microsoft.com> wrote in message
> news:131F85CA-AE34-411C-BA3B-902470935B7F@microsoft.com...
> > 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
> >
> > Ben
>
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] "Ben Fidge" wrote:
> 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
>
> "Martin Kulov" wrote:
>
> > Hi Ben,
> >
> > Some code sample will be very usefull.
> >
> > Best,
> > Martin
> >
> >
> > "Ben Fidge" <BenFidge@discussions.microsoft.com> wrote in message
> > news:131F85CA-AE34-411C-BA3B-902470935B7F@microsoft.com...
> > > 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
> > >
> > > Ben
> >
Don't see what you're looking for? Try a search.