LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 09.09.10 16:35
Оценка:
Привет,

Кому нибудь доводилось использоват LogonUser в .net-ных приложениях?
Не понимаю, почему не работаеь даже примитивный пример:

const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(string username, string domain, string password, int logonType, int logonProvider, ref IntPtr token);

public static WindowsImpersonationContext Logon(string domainName, string userName, string password) {
    IntPtr tokenHandle = IntPtr.Zero;

    LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle);

    var windowsIdentity = new WindowsIdentity(tokenHandle);
    return windowsIdentity.Impersonate();
}

static void Main() {
    using (Logon(_DOMAIN_NAME, _USER_NAME, _PASSWORD)) {
        Test();
    }
}

private static void Test() {
    Console.WriteLine(typeof(DataSet));
    Class1.Test();
}


на выходе:

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl
y 'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e08
9' or one of its dependencies. Access is denied.
at ConsoleApplication1.Program.Test()
at ConsoleApplication1.Program.Main()
Press any key to continue . . .

Как он может System.Data.dll не находить? Она же в GAC-е и должен быть видна всем.
Пользователь — доменный, состоит в локальных админах, пароль — правильный (runas успешно отрабатывает).

Подкиньте совет, куда копать?

Спасибо
Re: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 09.09.10 17:05
Оценка:
Здравствуйте, Lloyd, Вы писали:

А в какой строке исключение? Так-же систему озвучить не помешало-бв на всякий случай.

В VS2008, NET 3.5, WinXP этот код отработал на ура
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re[2]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 09.09.10 17:09
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, Lloyd, Вы писали:


JR>А в какой строке исключение? Так-же систему озвучить не помешало-бв на всякий случай.


Там, где зовется Test. Если заинлайнить метод, то все работает => тупит jitter.

JR>В VS2008, NET 3.5, WinXP этот код отработал на ура


VS 2010, .Net 4.0, Win 7x64.
Re[3]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 09.09.10 17:17
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Там, где зовется Test. Если заинлайнить метод, то все работает => тупит jitter.


А попробуйте поменять CharSet.Unicode на CharSet.Auto
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re[3]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 09.09.10 17:24
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Как он может System.Data.dll не находить?

L>Access is denied

Вообще-то она находит, но прав не имеет. Может Вы имперсонировались тем, кому туда ходу нет?
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re: LogonUser в .Net-ых приложениях
От: vmpire Россия  
Дата: 09.09.10 17:24
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Привет,


L>Кому нибудь доводилось использоват LogonUser в .net-ных приложениях?

L>Не понимаю, почему не работаеь даже примитивный пример:

L>
L>private static void Test() {
L>    Console.WriteLine(typeof(DataSet));
L>    Class1.Test();
L>}
L>


L>на выходе:

L>

L>Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl
L>y 'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e08
L>9' or one of its dependencies. Access is denied.
L> at ConsoleApplication1.Program.Test()
L> at ConsoleApplication1.Program.Main()
L>Press any key to continue . . .

L>Как он может System.Data.dll не находить? Она же в GAC-е и должен быть видна всем.
L>Пользователь — доменный, состоит в локальных админах, пароль — правильный (runas успешно отрабатывает).

L>Подкиньте совет, куда копать?


L>Спасибо



Console.WriteLine(typeof(DataSet)); — А это тут вообще зачем? К имперсонации, вроде, дела не имеет.
Ассембли, судя по исключению, находится, но не может загрузится. Проверьте права на каталоге Temporary ASP.NET Files, отсутствие прав на этот каталог проявляется примерно так же.

Что касается имперсонации — у меня не всегда получалось имперсонироваться непосредственно в токен, полученный от LogonUser, приходилось делать DuplicateToken с параметром SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation (равным 2).
Re[2]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 09.09.10 17:30
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Что касается имперсонации — у меня не всегда получалось имперсонироваться непосредственно в токен, полученный от LogonUser, приходилось делать DuplicateToken с параметром SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation (равным 2).


Странно. А подробностей не припомните? MSDN прямо говорит:

You can use the returned handle in calls to the ImpersonateLoggedOnUser function.


Да и я проблем не помню
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re[4]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 09.09.10 17:45
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

L>>Там, где зовется Test. Если заинлайнить метод, то все работает => тупит jitter.


JR>А попробуйте поменять CharSet.Unicode на CharSet.Auto


Имперсонация проходит нормально, в чем-то другом проблема. Не пойму.
Re[2]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 09.09.10 17:46
Оценка:
Здравствуйте, vmpire, Вы писали:

L>>Подкиньте совет, куда копать?


L>>Спасибо


V>Console.WriteLine(typeof(DataSet)); — А это тут вообще зачем? К имперсонации, вроде, дела не имеет.


Чтобы продемонстрировать, что проблема не в коде, а в jiter-е. Тут не важно, что именно в теле метода, главное, что есть ссылка на сборку, кот. подгружается jitter-ом.

V>Ассембли, судя по исключению, находится, но не может загрузится. Проверьте права на каталоге Temporary ASP.NET Files, отсутствие прав на этот каталог проявляется примерно так же.


Это не asp.net, обычное консольное приложение. Пользовател — в локальной группе админов.

V>Что касается имперсонации — у меня не всегда получалось имперсонироваться непосредственно в токен, полученный от LogonUser, приходилось делать DuplicateToken с параметром SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation (равным 2).


Спасибо, завтра попробую. Раньше похожий код у меня работал (где-то погода назад), cейчас почему-то отказывается. Кстати, имперсонация-то как раз проходит на ура.
Re[4]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 09.09.10 17:47
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

L>>Access is denied


JR>Вообще-то она находит, но прав не имеет. Может Вы имперсонировались тем, кому туда ходу нет?


Пользователь — в группе локальных админов. Куда уж выше-то?
Re[5]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 09.09.10 17:58
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Jolly Roger, Вы писали:


L>>>Access is denied


JR>>Вообще-то она находит, но прав не имеет. Может Вы имперсонировались тем, кому туда ходу нет?


L>Пользователь — в группе локальных админов. Куда уж выше-то?


И всё-же — "Access is denied". Я думаю, копать надо всё-таки в эту сторону. Ведь без имперсонации она грузится? А что поменялось? Только права текущего пользователя.
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re: LogonUser в .Net-ых приложениях
От: Uzzy Россия  
Дата: 09.09.10 18:23
Оценка:
Здравствуйте, Lloyd, Вы писали:

Что-то подобное возникает, если управляемая сборка на платформе х64 пытается подгрузить неуправляемую сборку, собранную для х86.
Re[2]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 09.09.10 18:30
Оценка:
Здравствуйте, Uzzy, Вы писали:

U>Что-то подобное возникает, если управляемая сборка на платформе х64 пытается подгрузить неуправляемую сборку, собранную для х86.


А почему тогда без LogonUser все работает как надо?
Re[6]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 09.09.10 18:33
Оценка:
Здравствуйте, Jolly Roger, Вы писали:


L>>Пользователь — в группе локальных админов. Куда уж выше-то?


JR>И всё-же — "Access is denied". Я думаю, копать надо всё-таки в эту сторону. Ведь без имперсонации она грузится? А что поменялось? Только права текущего пользователя.


Я не представляю, как в это сторону копать. Я уже дал пользователю права админа на локальной машине.
Re[3]: LogonUser в .Net-ых приложениях
От: Uzzy Россия  
Дата: 09.09.10 18:47
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Uzzy, Вы писали:


U>>Что-то подобное возникает, если управляемая сборка на платформе х64 пытается подгрузить неуправляемую сборку, собранную для х86.


L>А почему тогда без LogonUser все работает как надо?

Понятия не имею. Возможно настройки локали пользователя сказываются. (точка вместо запятой на дробном делителе, например).
Re[7]: LogonUser в .Net-ых приложениях
От: Neco  
Дата: 09.09.10 19:00
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Я не представляю, как в это сторону копать. Я уже дал пользователю права админа на локальной машине.

пробовали в политиках аудита включить все галки и в эвентах потом что-нить найти?
всю ночь не ем, весь день не сплю — устаю
Re[3]: LogonUser в .Net-ых приложениях
От: vmpire Россия  
Дата: 09.09.10 19:42
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, vmpire, Вы писали:


V>>Что касается имперсонации — у меня не всегда получалось имперсонироваться непосредственно в токен, полученный от LogonUser, приходилось делать DuplicateToken с параметром SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation (равным 2).


JR>Странно. А подробностей не припомните? MSDN прямо говорит:


JR>

JR>You can use the returned handle in calls to the ImpersonateLoggedOnUser function.


JR>Да и я проблем не помню

Вот хоть убейте не помню
Но помню, что пришлось усложнять из-за этого код. Тогда это было не то в Win2000 не то в WinXP без сервис-паков. Вроде бы (не уверен) было связано с доменными политиками у заказчика.
Re[7]: LogonUser в .Net-ых приложениях
От: vmpire Россия  
Дата: 09.09.10 19:52
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>>>Пользователь — в группе локальных админов. Куда уж выше-то?


JR>>И всё-же — "Access is denied". Я думаю, копать надо всё-таки в эту сторону. Ведь без имперсонации она грузится? А что поменялось? Только права текущего пользователя.


L>Я не представляю, как в это сторону копать. Я уже дал пользователю права админа на локальной машине.

А может это UAC в Windows 7? C ним админа может быть недостаточно.
Попробуйте явно пользователю дать права на всё в качестве эксперимента. Или покрутить настройки UAC.
Re[7]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 01:25
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Я не представляю, как в это сторону копать. Я уже дал пользователю права админа на локальной машине.


Я бы прежде всего посмотрел настройки безопасности файла. Хорошая мысль была высказана — включить аудит и посмотреть журнал. Вместо загрузки попробовал бы загрузить сборку как просто файл, запросив чтение, чтение-выполнение. Маловероятно, но всё-же глянул-бы, не отрубил-ли кто этой учётке SeChangeNotify. То есть попробовать набрать побольше статистики.
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Re[3]: LogonUser в .Net-ых приложениях
От: BluntBlind  
Дата: 10.09.10 03:05
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Jolly Roger, Вы писали:

JR>>Здравствуйте, Lloyd, Вы писали:
JR>>А в какой строке исключение? Так-же систему озвучить не помешало-бв на всякий случай.
L>Там, где зовется Test. Если заинлайнить метод, то все работает => тупит jitter.
JR>>В VS2008, NET 3.5, WinXP этот код отработал на ура
L>VS 2010, .Net 4.0, Win 7x64.

1. А студия с правами Админа работает? Может помочь

2. Возможно у меня недостоверные данные, по памяти вспоминаю, но уже натыкался на такое:
Если при загрузке сборок вылетает Access is denied — это все же может быть именно отсутствие файла, а не проблемы безопасности.

3. Все проекты в .NET4 компилятся?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.