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 в Вашем случае. Это можно сделать через свойства — защита — дополнительно — аудит. Вам нужно добавить туда ауди отказа на все действия, для Вашего пользователя.
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
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 и ранних, для висты и семёрки надо проверять.
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
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
— нет.
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
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 персел, во избежании подобных "чудес".
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
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, хотя сомнительно. Может, доменными политиками перекрыта. Эх, мне бы самому "пошарить", ручками, но не на чем

Однако если у пользователя будет доступ ко всем папкам в пути, то эта привилегия не понадобится. Вы аудит посмотрели? Какой запрос отклонён, к какому объекту?
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
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 можно получить список групп, в которые входит пользователь. Попробйте их получить и выложите сюда.
http://files.rsdn.org/82987/Img.GIF "Нормальные герои всегда идут в обход!"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.