Здравствуйте, 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
Здравствуйте, vmpire, Вы писали:
JR>>>И всё-же — "Access is denied". Я думаю, копать надо всё-таки в эту сторону. Ведь без имперсонации она грузится? А что поменялось? Только права текущего пользователя.
L>>Я не представляю, как в это сторону копать. Я уже дал пользователю права админа на локальной машине. V>А может это UAC в Windows 7? C ним админа может быть недостаточно. V>Попробуйте явно пользователю дать права на всё в качестве эксперимента. Или покрутить настройки UAC.
Отключил UAC, перегрузился, вроде заработало. Но, блин, это же не вариант, должен быть какой-то нормальный способ.
Здравствуйте, Jolly Roger, Вы писали:
JR>Я бы прежде всего посмотрел настройки безопасности файла. Хорошая мысль была высказана — включить аудит и посмотреть журнал. Вместо загрузки попробовал бы загрузить сборку как просто файл, запросив чтение, чтение-выполнение. Маловероятно, но всё-же глянул-бы, не отрубил-ли кто этой учётке SeChangeNotify. То есть попробовать набрать побольше статистики.
В eventlog-е запись logon-а содержит такую информацию:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, vmpire, Вы писали:
JR>>>>И всё-же — "Access is denied". Я думаю, копать надо всё-таки в эту сторону. Ведь без имперсонации она грузится? А что поменялось? Только права текущего пользователя.
L>>>Я не представляю, как в это сторону копать. Я уже дал пользователю права админа на локальной машине. V>>А может это UAC в Windows 7? C ним админа может быть недостаточно. V>>Попробуйте явно пользователю дать права на всё в качестве эксперимента. Или покрутить настройки UAC.
L>Отключил UAC, перегрузился, вроде заработало. Но, блин, это же не вариант, должен быть какой-то нормальный способ.
Если не затруднит, можно определения LogonType, LogonProvider, SecurityAttributes, DuplicateTokenEx, MaximumAllowed, SecurityImpersonationLevel, TokenType?
Спасибо.
Здравствуйте, 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;
Здравствуйте, 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 в Вашем случае. Это можно сделать через свойства — защита — дополнительно — аудит. Вам нужно добавить туда ауди отказа на все действия, для Вашего пользователя.
Здравствуйте, 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 и ранних, для висты и семёрки надо проверять.
Здравствуйте, Jolly Roger, Вы писали:
L>>SeChangeNotify тут нет. Что это такое? Как его можно включить?
JR>Это уже любопытно. Это привилегия "двойного назначения". Она, как следует из имени, позволяет получать извещения от файловой системе, а в дополнение позволяет выполнить обход перекрёстной проверки. Или, если человеческим языком, она позволяет получить доступ с "C\Folder1\Folder2\SomeFile.exe" даже если Вам запрещён доступ к Folder1. Она должна быть умолчанию у всех пользователей, более того, она по умолчанию включена у всех пользователей. Отсутствие её у Вашего пользователя уже настораживает. Попробуйте временно создать нового пользователя, не входящего в админы и имперсонироваться под ним.
JR>Да, включить привилегию можно через политики — права пользователей, по-русски — "обход перекрёстной проверки".
Если это "Bypass traverse checking", то для группы Adninistrators (куда входит мой пользователь) она включена у меня. Наверное все-таки проблема в UAC
Здравствуйте, 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).
Можно, конечно, прописать в манифесте, что программа требует полномочий администратора, но это уж совсем от безысходности. И пользователя будет доставать.
Здравствуйте, 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) права текущего пользователя до админа?
Здравствуйте, Jolly Roger, Вы писали:
L>>для группы Adninistrators (куда входит мой пользователь) она включена у меня. Наверное все-таки проблема в UAC
JR>Для админов включена, а для Вашего конкретного пользователя, судя по этому
Здравствуйте, Lloyd, Вы писали:
L>Я уже посмотрел. Валится с ACCESS DENIED при попытке доступа к bin\Debug\ConsoleApplication1.exe.config.
Ещё страннее. А на этот файл Вы настройки безопасности посмотрели?
L>Может как-то можно принудительно поднять (elevate) права текущего пользователя до админа?
Поднять-то можно, только плохой это путь, неправильный. Вы уверены, что он всегда будет администротором, у всех пользователей? Я бы на это не закладывался. Надо-бы разобраться, почему так не работает. Может у Вас слишком жёсткие настройки на папку, в которой этот ConsoleApplication1.exe.config?
PS Никогда не пишу программы под админом, с тех пор как на W2k с Me персел, во избежании подобных "чудес".
Здравствуйте, Lloyd, Вы писали:
L>Да, но мой пользователь в этой группе.
Видимо что-то с пользователем. А программа работает если под ним логинится и запускать без имперсонизации?
Здравствуйте, Lloyd, Вы писали:
L>Да, но мой пользователь в этой группе.
Возможно, их режет UAC, хотя сомнительно. Может, доменными политиками перекрыта. Эх, мне бы самому "пошарить", ручками, но не на чем
Однако если у пользователя будет доступ ко всем папкам в пути, то эта привилегия не понадобится. Вы аудит посмотрели? Какой запрос отклонён, к какому объекту?
Здравствуйте, 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 персел, во избежании подобных "чудес".
Здравствуйте, Jolly Roger, Вы писали:
L>>Да, но мой пользователь в этой группе.
JR>Возможно, их режет UAC, хотя сомнительно. Может, доменными политиками перекрыта. Эх, мне бы самому "пошарить", ручками, но не на чем
JR>Однако если у пользователя будет доступ ко всем папкам в пути, то эта привилегия не понадобится. Вы аудит посмотрели? Какой запрос отклонён, к какому объекту?
Похоже, пользователь с админскими правами не может открыть домашние каталоги других пользователей, хотя в настройках каталога явно прописано иное.
Если запускаю консоль сразу в elevated-режиме (утилита elevated c wintellect.com), то могу нормально открывать каталоги.
Это нормальное поведение или у меня что-то не так?
Здравствуйте, Lloyd, Вы писали:
JR>>Ещё страннее. А на этот файл Вы настройки безопасности посмотрели?
L>Да ничего особенного нет.
А "не особенное" что-нибудь есть?
L>Похоже я чего-то в этой жизни не понимаю.
L>Есть пользователь A, находясь в учетке которого я через runas запускаю новую консоль с правами пользователя B (локальный админ). L>В настройках домашнего каталога пользователя A прописано, что админы имеют полный доступ. L>Пытаюсь перейти в консоли в домашний каталог пользователя A и получаю отлуп (Access is denied).
L>Чё за фигня? Я же админ! Так и должно быть???
Насколько мне известно, под UAC без элевации членство в группе админов отключается. Также отключаются некоторые привилегии, но я не припомню, чтобы сюда входила SeChangeNotify, надо-бы поискать в MSDN. Если правильно помню, через WindowsIdentity или IdentityReferense можно получить список групп, в которые входит пользователь. Попробйте их получить и выложите сюда.