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 этот код отработал на ура
"Нормальные герои всегда идут в обход!"
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
"Нормальные герои всегда идут в обход!"
Re[3]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 09.09.10 17:24
Оценка:
Здравствуйте, Lloyd, Вы писали:

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

L>Access is denied

Вообще-то она находит, но прав не имеет. Может Вы имперсонировались тем, кому туда ходу нет?
"Нормальные герои всегда идут в обход!"
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.


Да и я проблем не помню
"Нормальные герои всегда идут в обход!"
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". Я думаю, копать надо всё-таки в эту сторону. Ведь без имперсонации она грузится? А что поменялось? Только права текущего пользователя.
"Нормальные герои всегда идут в обход!"
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. То есть попробовать набрать побольше статистики.
"Нормальные герои всегда идут в обход!"
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 компилятся?
Re[8]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 08:59
Оценка:
Здравствуйте, Neco, Вы писали:

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

N>пробовали в политиках аудита включить все галки и в эвентах потом что-нить найти?

Попробовал. В итоге:

Audit Success 9/10/2010 10:58:08 AM Microsoft Windows security auditing. 4634 Logoff
Audit Success 9/10/2010 10:58:08 AM Microsoft Windows security auditing. 4634 Logoff
Audit Success 9/10/2010 10:58:07 AM Microsoft Windows security auditing. 4672 Special Logon

Re[8]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 09:12
Оценка:
Здравствуйте, vmpire, Вы писали:

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


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

V>А может это UAC в Windows 7? C ним админа может быть недостаточно.
V>Попробуйте явно пользователю дать права на всё в качестве эксперимента. Или покрутить настройки UAC.

Отключил UAC, перегрузился, вроде заработало. Но, блин, это же не вариант, должен быть какой-то нормальный способ.
Re[8]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 09:28
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Я бы прежде всего посмотрел настройки безопасности файла. Хорошая мысль была высказана — включить аудит и посмотреть журнал. Вместо загрузки попробовал бы загрузить сборку как просто файл, запросив чтение, чтение-выполнение. Маловероятно, но всё-же глянул-бы, не отрубил-ли кто этой учётке SeChangeNotify. То есть попробовать набрать побольше статистики.


В eventlog-е запись logon-а содержит такую информацию:

Special privileges assigned to new logon.

Subject:
Security ID: ZD0\vlpa-adm
Account Name: vlpa-adm
Account Domain: ZD0
Logon ID: 0x1001b7

Privileges: SeSecurityPrivilege
SeTakeOwnershipPrivilege
SeLoadDriverPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeDebugPrivilege
SeSystemEnvironmentPrivilege
SeImpersonatePrivilege

SeChangeNotify тут нет. Что это такое? Как его можно включить?
Re[9]: LogonUser в .Net-ых приложениях
От: Uzzy Россия  
Дата: 10.09.10 09:42
Оценка: 20 (1)
Здравствуйте, Lloyd, Вы писали:

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


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


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

V>>А может это UAC в Windows 7? C ним админа может быть недостаточно.
V>>Попробуйте явно пользователю дать права на всё в качестве эксперимента. Или покрутить настройки UAC.

L>Отключил UAC, перегрузился, вроде заработало. Но, блин, это же не вариант, должен быть какой-то нормальный способ.


Попробуйте такой вариант имперсонизации


        public void Execute(Credentials credentials, Action action)
        {
            IntPtr token = IntPtr.Zero;
            try
            {
                bool loggedOn = LogonUser(
                    credentials.User,
                    credentials.Domain,
                    credentials.Password,
                    (int)LogonType.LogonInteractive,
                    (int)LogonProvider.Logon32ProviderDefault,
                    out token
                    );

                if (!loggedOn)
                {
                    throw %exception%;
                }

                IntPtr duplicateToken = IntPtr.Zero;
                try
                {
                    SecurityAttributes attributes = new SecurityAttributes();
                    if (DuplicateTokenEx(token, MaximumAllowed, ref attributes,
                                         SecurityImpersonationLevel.SecurityImpersonation, TokenType.TokenPrimary,
                                         out duplicateToken))
                    {
                        WindowsIdentity windowsIdentity = new WindowsIdentity(duplicateToken);

                        WindowsImpersonationContext impersonationContext = windowsIdentity.Impersonate();
                        try
                        {
                            action();
                        }
                        finally
                        {
                            impersonationContext.Undo();
                        }
                    }
                    else
                    {
                        throw %exception%;
                    }
                }
                finally
                {
                    if (duplicateToken != IntPtr.Zero)
                    {
                        CloseHandle(duplicateToken);
                    }
                }
            }
            finally
            {
                if (token != IntPtr.Zero)
                {
                    CloseHandle(token);
                }
            }
        }
Re[10]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 10:02
Оценка:
Здравствуйте, Uzzy, Вы писали:

U>Попробуйте такой вариант имперсонизации



U>
U>  ...
U>                    if (duplicateToken != IntPtr.Zero)
U>                    {
U>                        CloseHandle(duplicateToken);
U>                    }
U>                }
U>            }
U>            finally
U>            {
U>                if (token != IntPtr.Zero)
U>                {
U>                    CloseHandle(token);
U>                }
U>            }
U>        }

U>


Если не затруднит, можно определения LogonType, LogonProvider, SecurityAttributes, DuplicateTokenEx, MaximumAllowed, SecurityImpersonationLevel, TokenType?
Спасибо.
Re[11]: LogonUser в .Net-ых приложениях
От: Uzzy Россия  
Дата: 10.09.10 10:11
Оценка: 30 (1)
Здравствуйте, Lloyd, Вы писали:

L>Если не затруднит, можно определения LogonType, LogonProvider, SecurityAttributes, DuplicateTokenEx, MaximumAllowed, SecurityImpersonationLevel, TokenType?


        private enum LogonType
        {
            /// <summary>
            /// This logon type is intended for users who will be interactively using the computer, such as a user being logged on  
            /// by a terminal server, remote shell, or similar process.
            /// This logon type has the additional expense of caching logon information for disconnected operations;
            /// therefore, it is inappropriate for some client/server applications,
            /// such as a mail server.
            /// </summary>
            LogonInteractive = 2,

            /// <summary>
            /// This logon type is intended for high performance servers to authenticate plaintext passwords.

            /// The LogonUser function does not cache credentials for this logon type.
            /// </summary>
            LogonNetwork = 3,

            /// <summary>
            /// This logon type is intended for batch servers, where processes may be executing on behalf of a user without
            /// their direct intervention. This type is also for higher performance servers that process many plaintext
            /// authentication attempts at a time, such as mail or Web servers.
            /// The LogonUser function does not cache credentials for this logon type.
            /// </summary>
            LogonBatch = 4,

            /// <summary>
            /// Indicates a service-type logon. The account provided must have the service privilege enabled.
            /// </summary>
            LogonService = 5,

            /// <summary>
            /// This logon type is for GINA DLLs that log on users who will be interactively using the computer.
            /// This logon type can generate a unique audit record that shows when the workstation was unlocked.
            /// </summary>
            LogonUnlock = 7,

            /// <summary>
            /// This logon type preserves the name and password in the authentication package, which allows the server to make
            /// connections to other network servers while impersonating the client. A server can accept plaintext credentials
            /// from a client, call LogonUser, verify that the user can access the system across the network, and still
            /// communicate with other servers.
            /// NOTE: Windows NT:  This value is not supported.
            /// </summary>
            LogonNetworkCleartext = 8,

            /// <summary>
            /// This logon type allows the caller to clone its current token and specify new credentials for outbound connections.
            /// The new logon session has the same local identifier but uses different credentials for other network connections.
            /// NOTE: This logon type is supported only by the LOGON32_PROVIDER_WINNT50 logon provider.
            /// NOTE: Windows NT:  This value is not supported.
            /// </summary>
            LogonNewCredentials = 9,
        }

        private enum LogonProvider
        {
            /// <summary>
            /// Use the standard logon provider for the system.
            /// The default security provider is negotiate, unless you pass NULL for the domain name and the user name
            /// is not in UPN format. In this case, the default provider is NTLM.
            /// NOTE: Windows 2000/NT:   The default security provider is NTLM.
            /// </summary>
            Logon32ProviderDefault = 0,
        }

        private enum SecurityImpersonationLevel
        {
            /// <summary>
            /// The server process cannot obtain identification information about the client,
            /// and it cannot impersonate the client. It is defined with no value given, and thus,
            /// by ANSI C rules, defaults to a value of zero.
            /// </summary>
            SecurityAnonymous = 0,

            /// <summary>
            /// The server process can obtain information about the client, such as security identifiers and privileges,
            /// but it cannot impersonate the client. This is useful for servers that export their own objects,
            /// for example, database products that export tables and views.
            /// Using the retrieved client-security information, the server can make access-validation decisions without
            /// being able to use other services that are using the client's security context.
            /// </summary>
            SecurityIdentification = 1,

            /// <summary>
            /// The server process can impersonate the client's security context on its local system.
            /// The server cannot impersonate the client on remote systems.
            /// </summary>
            SecurityImpersonation = 2,

            /// <summary>
            /// The server process can impersonate the client's security context on remote systems.
            /// NOTE: Windows NT:  This impersonation level is not supported.
            /// </summary>
            SecurityDelegation = 3,
        }

        private enum TokenType
        {
            TokenPrimary = 1,
            TokenImpersonation
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct SecurityAttributes
        {
            public int Length;
            public IntPtr SecurityDescriptor;
            public int InheritHandle;
        }

        public sealed class ImpersonatedAction<T>
        {
            // ------------- Nested Types -------------

            // ------------- Fields -------------
            private readonly string _name;
            private readonly Func<T> _func;

            // ------------- .ctors -------------
            public ImpersonatedAction(string name, Func<T> func)
            {
                _name = name;
                _func = func;
            }

            // ------------- Events -------------

            // ------------- Methods -------------
            public override string ToString()
            {
                return Name;
            }

            // ------------- Properties -------------
            public Func<T> Func
            {
                get
                {
                    return _func;
                }
            }

            private string Name
            {
                get
                {
                    return _name;
                }
            }
            // ------------- Interface Implementation -------------

        }

        // ReSharper enable UnusedMember.Local
        // ------------- Fields -------------
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool LogonUser(
            string lpszUsername,
            string lpszDomain,
            string lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            out IntPtr phToken
            );

        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool DuplicateTokenEx(
            IntPtr existingTokenHandle,
            int dwsDesiredAccess,
            ref SecurityAttributes lpTokenAttributes,
            SecurityImpersonationLevel dwsSecurityImpersonationLevel,
            TokenType tokenType,
            out IntPtr duplicateToken);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseHandle(IntPtr hObject);

        private const int MaximumAllowed = 0x02000000;


L>Спасибо.

не за что
... << RSDN@Home 1.2.0 alpha 4 rev. 1270>>
Re[12]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 10:17
Оценка:
Здравствуйте, Uzzy, Вы писали:

L>>Спасибо.

U>не за что

та же хрень.
Re[9]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 10:20
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Попробовал. В итоге:

L>

L>Audit Success 9/10/2010 10:58:08 AM Microsoft Windows security auditing. 4634 Logoff
L>Audit Success 9/10/2010 10:58:08 AM Microsoft Windows security auditing. 4634 Logoff
L>Audit Success 9/10/2010 10:58:07 AM Microsoft Windows security auditing. 4672 Special Logon


Это не то. Нужно включить аудит доступа к файлам и папкам. Сам аудит включается в локальных политиках, но нужно ещё настроить System ACL(SACL) интересующих объектов, System.Data.dll в Вашем случае. Это можно сделать через свойства — защита — дополнительно — аудит. Вам нужно добавить туда ауди отказа на все действия, для Вашего пользователя.
"Нормальные герои всегда идут в обход!"
Re[9]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 10:31
Оценка: 9 (1)
Здравствуйте, Lloyd, Вы писали:

L>Privileges: SeSecurityPrivilege

L> SeTakeOwnershipPrivilege
L> SeLoadDriverPrivilege
L> SeBackupPrivilege
L> SeRestorePrivilege
L> SeDebugPrivilege
L> SeSystemEnvironmentPrivilege
L> SeImpersonatePrivilege

L>SeChangeNotify тут нет. Что это такое? Как его можно включить?


Это уже любопытно. Это привилегия "двойного назначения". Она, как следует из имени, позволяет получать извещения от файловой системе, а в дополнение позволяет выполнить обход перекрёстной проверки. Или, если человеческим языком, она позволяет получить доступ с "C\Folder1\Folder2\SomeFile.exe" даже если Вам запрещён доступ к Folder1. Она должна быть умолчанию у всех пользователей, более того, она по умолчанию включена у всех пользователей. Отсутствие её у Вашего пользователя уже настораживает. Попробуйте временно создать нового пользователя, не входящего в админы и имперсонироваться под ним.

Да, включить привилегию можно через политики — права пользователей, по-русски — "обход перекрёстной проверки".

PS Написанное справедливо для XP и ранних, для висты и семёрки надо проверять.
"Нормальные герои всегда идут в обход!"
Re[10]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 11:11
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

L>>SeChangeNotify тут нет. Что это такое? Как его можно включить?


JR>Это уже любопытно. Это привилегия "двойного назначения". Она, как следует из имени, позволяет получать извещения от файловой системе, а в дополнение позволяет выполнить обход перекрёстной проверки. Или, если человеческим языком, она позволяет получить доступ с "C\Folder1\Folder2\SomeFile.exe" даже если Вам запрещён доступ к Folder1. Она должна быть умолчанию у всех пользователей, более того, она по умолчанию включена у всех пользователей. Отсутствие её у Вашего пользователя уже настораживает. Попробуйте временно создать нового пользователя, не входящего в админы и имперсонироваться под ним.


JR>Да, включить привилегию можно через политики — права пользователей, по-русски — "обход перекрёстной проверки".


Если это "Bypass traverse checking", то для группы Adninistrators (куда входит мой пользователь) она включена у меня. Наверное все-таки проблема в UAC
Re[9]: LogonUser в .Net-ых приложениях
От: vmpire Россия  
Дата: 10.09.10 11:12
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


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


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

V>>А может это UAC в Windows 7? C ним админа может быть недостаточно.
V>>Попробуйте явно пользователю дать права на всё в качестве эксперимента. Или покрутить настройки UAC.

L>Отключил UAC, перегрузился, вроде заработало. Но, блин, это же не вариант, должен быть какой-то нормальный способ.

Значит, причина примерно найдена.
Теперь нужно проверить права доступа к GAC 4-го фреймворка (права на чтение файлов) для нужного пользователя.
Ниже подсказали хорошую идею с аудитом (я бы включил сразу на весь диск) и попыткой открыть сборку как файл.
От себя могу ещё порекомендовать process monitor от Sysinternals (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx).

Можно, конечно, прописать в манифесте, что программа требует полномочий администратора, но это уж совсем от безысходности. И пользователя будет доставать.
Re[10]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 11:18
Оценка:
Здравствуйте, vmpire, Вы писали:

V>>>Попробуйте явно пользователю дать права на всё в качестве эксперимента. Или покрутить настройки UAC.


L>>Отключил UAC, перегрузился, вроде заработало. Но, блин, это же не вариант, должен быть какой-то нормальный способ.

V>Значит, причина примерно найдена.
V>Теперь нужно проверить права доступа к GAC 4-го фреймворка (права на чтение файлов) для нужного пользователя.
V>Ниже подсказали хорошую идею с аудитом (я бы включил сразу на весь диск) и попыткой открыть сборку как файл.
V>От себя могу ещё порекомендовать process monitor от Sysinternals (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx).

Я уже посмотрел. Валится с ACCESS DENIED при попытке доступа к bin\Debug\ConsoleApplication1.exe.config.

Может как-то можно принудительно поднять (elevate) права текущего пользователя до админа?
Re[11]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 11:29
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Если это "Bypass traverse checking",


Да.

L>для группы Adninistrators (куда входит мой пользователь) она включена у меня. Наверное все-таки проблема в UAC


Для админов включена, а для Вашего конкретного пользователя, судя по этому
Автор: Lloyd
Дата: 10.09.10
— нет.
"Нормальные герои всегда идут в обход!"
Re[12]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 11:32
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

L>>для группы Adninistrators (куда входит мой пользователь) она включена у меня. Наверное все-таки проблема в UAC


JR>Для админов включена, а для Вашего конкретного пользователя, судя по этому
Автор: Lloyd
Дата: 10.09.10
— нет.


Да, но мой пользователь в этой группе.
Re[11]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 11:37
Оценка: 27 (1)
Здравствуйте, Lloyd, Вы писали:

L>Я уже посмотрел. Валится с ACCESS DENIED при попытке доступа к bin\Debug\ConsoleApplication1.exe.config.


Ещё страннее. А на этот файл Вы настройки безопасности посмотрели?

L>Может как-то можно принудительно поднять (elevate) права текущего пользователя до админа?


Поднять-то можно, только плохой это путь, неправильный. Вы уверены, что он всегда будет администротором, у всех пользователей? Я бы на это не закладывался. Надо-бы разобраться, почему так не работает. Может у Вас слишком жёсткие настройки на папку, в которой этот ConsoleApplication1.exe.config?

PS Никогда не пишу программы под админом, с тех пор как на W2k с Me персел, во избежании подобных "чудес".
"Нормальные герои всегда идут в обход!"
Re[13]: LogonUser в .Net-ых приложениях
От: Uzzy Россия  
Дата: 10.09.10 11:41
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Да, но мой пользователь в этой группе.

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

L>Да, но мой пользователь в этой группе.


Возможно, их режет UAC, хотя сомнительно. Может, доменными политиками перекрыта. Эх, мне бы самому "пошарить", ручками, но не на чем

Однако если у пользователя будет доступ ко всем папкам в пути, то эта привилегия не понадобится. Вы аудит посмотрели? Какой запрос отклонён, к какому объекту?
"Нормальные герои всегда идут в обход!"
Re[12]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 11:48
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

L>>Я уже посмотрел. Валится с ACCESS DENIED при попытке доступа к bin\Debug\ConsoleApplication1.exe.config.


JR>Ещё страннее. А на этот файл Вы настройки безопасности посмотрели?


Да ничего особенного нет.

L>>Может как-то можно принудительно поднять (elevate) права текущего пользователя до админа?


JR>Поднять-то можно, только плохой это путь, неправильный. Вы уверены, что он всегда будет администротором, у всех пользователей? Я бы на это не закладывался. Надо-бы разобраться, почему так не работает. Может у Вас слишком жёсткие настройки на папку, в которой этот ConsoleApplication1.exe.config?


Похоже я чего-то в этой жизни не понимаю.

Есть пользователь A, находясь в учетке которого я через runas запускаю новую консоль с правами пользователя B (локальный админ).
В настройках домашнего каталога пользователя A прописано, что админы имеют полный доступ.
Пытаюсь перейти в консоли в домашний каталог пользователя A и получаю отлуп (Access is denied).

Чё за фигня? Я же админ! Так и должно быть???

JR>PS Никогда не пишу программы под админом, с тех пор как на W2k с Me персел, во избежании подобных "чудес".
Re[14]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 11:55
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

L>>Да, но мой пользователь в этой группе.


JR>Возможно, их режет UAC, хотя сомнительно. Может, доменными политиками перекрыта. Эх, мне бы самому "пошарить", ручками, но не на чем


JR>Однако если у пользователя будет доступ ко всем папкам в пути, то эта привилегия не понадобится. Вы аудит посмотрели? Какой запрос отклонён, к какому объекту?


Похоже, пользователь с админскими правами не может открыть домашние каталоги других пользователей, хотя в настройках каталога явно прописано иное.
Если запускаю консоль сразу в elevated-режиме (утилита elevated c wintellect.com), то могу нормально открывать каталоги.

Это нормальное поведение или у меня что-то не так?
Re[13]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 11:58
Оценка: 30 (1)
Здравствуйте, Lloyd, Вы писали:

JR>>Ещё страннее. А на этот файл Вы настройки безопасности посмотрели?


L>Да ничего особенного нет.

А "не особенное" что-нибудь есть?

L>Похоже я чего-то в этой жизни не понимаю.


L>Есть пользователь A, находясь в учетке которого я через runas запускаю новую консоль с правами пользователя B (локальный админ).

L>В настройках домашнего каталога пользователя A прописано, что админы имеют полный доступ.
L>Пытаюсь перейти в консоли в домашний каталог пользователя A и получаю отлуп (Access is denied).

L>Чё за фигня? Я же админ! Так и должно быть???


Насколько мне известно, под UAC без элевации членство в группе админов отключается. Также отключаются некоторые привилегии, но я не припомню, чтобы сюда входила SeChangeNotify, надо-бы поискать в MSDN. Если правильно помню, через WindowsIdentity или IdentityReferense можно получить список групп, в которые входит пользователь. Попробйте их получить и выложите сюда.
"Нормальные герои всегда идут в обход!"
Re[14]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 12:12
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>>>Ещё страннее. А на этот файл Вы настройки безопасности посмотрели?


L>>Да ничего особенного нет.

JR> А "не особенное" что-нибудь есть?


Галочки у всех одинаковые.

L>>Есть пользователь A, находясь в учетке которого я через runas запускаю новую консоль с правами пользователя B (локальный админ).

L>>В настройках домашнего каталога пользователя A прописано, что админы имеют полный доступ.
L>>Пытаюсь перейти в консоли в домашний каталог пользователя A и получаю отлуп (Access is denied).

L>>Чё за фигня? Я же админ! Так и должно быть???


JR>Насколько мне известно, под UAC без элевации членство в группе админов отключается. Также отключаются некоторые привилегии, но я не припомню, чтобы сюда входила SeChangeNotify, надо-бы поискать в MSDN. Если правильно помню, через WindowsIdentity или IdentityReferense можно получить список групп, в которые входит пользователь. Попробйте их получить и выложите сюда.


Гм.

S-1-5-21-758755112-1449539674-1150540125-513
S-1-1-0
S-1-5-32-545
S-1-5-4
S-1-2-1
S-1-5-11
S-1-5-15
S-1-5-64-10

Re[15]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 12:27
Оценка: 99 (6)
Здравствуйте, Lloyd, Вы писали:


L>Гм.

Гм, вообще-то можно было и в имена перевести Ну да ладно, и так ясно.
L>

L>S-1-5-21-758755112-1449539674-1150540125-513
L>S-1-1-0
L>S-1-5-32-545
L>S-1-5-4
L>S-1-2-1
L>S-1-5-11
L>S-1-5-15
L>S-1-5-64-10

Итак, группы админов здесь (S-1-5-32-544) нет, зато есть ограниченные юзеры (S-1-5-32-545). Зато в правах наоборот — юзеров нет, а есть доступ системе, админам и себе, любимому. Вот, собственно, и ответ — данному пользователю без элевации доступ запрещён. Чтобы работало, надо дать доступ Users, только не надо давать полный, дайте только нужное. Чтения, я думаю, хватит.
"Нормальные герои всегда идут в обход!"
Re[16]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 12:39
Оценка: :)))
Здравствуйте, Jolly Roger, Вы писали:

L>>Гм.

JR>Гм, вообще-то можно было и в имена перевести Ну да ладно, и так ясно.

А как? Чисто на будущее.

L>>

L>>S-1-5-21-758755112-1449539674-1150540125-513
L>>S-1-1-0
L>>S-1-5-32-545
L>>S-1-5-4
L>>S-1-2-1
L>>S-1-5-11
L>>S-1-5-15
L>>S-1-5-64-10

JR>Итак, группы админов здесь (S-1-5-32-544) нет, зато есть ограниченные юзеры (S-1-5-32-545). Зато в правах наоборот — юзеров нет, а есть доступ системе, админам и себе, любимому. Вот, собственно, и ответ — данному пользователю без элевации доступ запрещён. Чтобы работало, надо дать доступ Users, только не надо давать полный, дайте только нужное. Чтения, я думаю, хватит.

Йокарный бабай! Заработало!!!
Спасибо огроменное.
Re[17]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 13:08
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


L>>>Гм.

JR>>Гм, вообще-то можно было и в имена перевести Ну да ладно, и так ясно.

L>А как? Чисто на будущее.


Я точно не помню, но примерно так — SecurityIdentifier.Translate(typeof(NTAccount)).ToString()
"Нормальные герои всегда идут в обход!"
Re[16]: LogonUser в .Net-ых приложениях
От: Lloyd Россия  
Дата: 10.09.10 13:24
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Итак, группы админов здесь (S-1-5-32-544) нет, зато есть ограниченные юзеры (S-1-5-32-545). Зато в правах наоборот — юзеров нет, а есть доступ системе, админам и себе, любимому. Вот, собственно, и ответ — данному пользователю без элевации доступ запрещён. Чтобы работало, надо дать доступ Users, только не надо давать полный, дайте только нужное. Чтения, я думаю, хватит.


Блиин, рано я радоваться начал.

На тестовом локальном аккаунте — работает, на тестовом доменном — тоже.
А мне нужно на аккаунте из другого (доверенного) домена, а с ним — не работает, хотя runas прекрасно отрабатывает с таким аккаунтом.
Re[17]: LogonUser в .Net-ых приложениях
От: Jolly Roger  
Дата: 10.09.10 13:40
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>На тестовом локальном аккаунте — работает, на тестовом доменном — тоже.

L>А мне нужно на аккаунте из другого (доверенного) домена, а с ним — не работает, хотя runas прекрасно отрабатывает с таким аккаунтом.

Ну путь-то тот-же, надо для начала посмотреть состав групп, в которые входит этот пользователь, а так-же набор его привилегий. Но я-бы предложил более радикальное решение — создать отдельную папку, к ней дать полный доступ юзеру, под которым будет стартовать приложение, и доступ всем (Everyone) на чтение. Туда и складывать все файлы, к которым должен быть общий доступ. Вы не расстраивайтесь, это стандартный подход в такого рода ситуациях
"Нормальные герои всегда идут в обход!"
Re[15]: LogonUser в .Net-ых приложениях
От: fddima  
Дата: 10.09.10 13:44
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Похоже, пользователь с админскими правами не может открыть домашние каталоги других пользователей, хотя в настройках каталога явно прописано иное.

L>Если запускаю консоль сразу в elevated-режиме (утилита elevated c wintellect.com), то могу нормально открывать каталоги.
L>Это нормальное поведение или у меня что-то не так?
Нормальное. Поизучай вывод whoami /priv из под limited user (админ с UAC), и с elevated, и для обычного юзера — разница колосальная. Более того, даже изменение некоторых локальных политик зачастую не оказывает влияние на этого самого limited user (может я просто не разобрался как ). Например кому-бы я ни давал привилегию на создание глобальных объектов, хоть своему пользователю, а не группе, — привилегии на деле всё равно не оказывается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.