powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему так работает SqlConnection?
15 сообщений из 15, страница 1 из 1
Почему так работает SqlConnection?
    #38709271
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это кусок кода из WCF сервиса, работающего как консольное приложение, оно работает на машине m1 и запущено юзером u1.
Клиентские c# приложения коннектятся по протоколу net.tcp.

1. Клиент на этой же машине пускается тем же юзером u1 - все хорошо.
2. Клиент на машине m2 запускается юзером u2 - на попытке открытия коннекции (см. ниже) ошибка

авторcould not load file or assembly system.enterpriseservices ... or one of its dependencies. Either a
required impersonation level was not provided, or the provided
impersonation level is invalid



Доменный юзер u2 входит в Администраторы на компьютере m1.
Оба компьютеры под Win7 в локальной сети с доменом.

Как бороться с этим?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public ConnectEx(WindowsIdentity callerWindowsIdentity, string conStr)
{
    try
    {
        lock (m_b)
        {
			string u1;
			string u2;

            u1 = WindowsIdentity.GetCurrent().Name.ToUpper();
            u2 = callerWindowsIdentity.Name.ToUpper();

            if (callerWindowsIdentity != null)
            {
                m_callerWindowsIdentity = callerWindowsIdentity;
                m_wic = m_callerWindowsIdentity.Impersonate();
            }
            Connection = new SqlConnection(conStr);
            Connection.Open(); //<-----------------------не открывает.
        }
    }
    catch (Exception x)
    {
        mainLogger.MainLogger.ErrorFormat("Error: [{0}], {1}",WindowsIdentity.GetCurrent().Name,  x.Message);
    }
    finally
    {
        if (callerWindowsIdentity != null
            && m_wic != null)
        {
            m_wic.Undo();
            m_wic = null;
        }
    }
}
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709276
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
conStr = ???

а ошибка какая?
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709278
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709280
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh2. Клиент на машине m2 запускается юзером u2
WinnipuhДоменный юзер u2 входит в Администраторы на компьютере m1.

ну так комп то другой, кто там у вас этот u2 на машине m2 ?
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709288
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneconStr = ???

а ошибка какая?

ConnectionString - нормальная, с ней же конектится локальный юзер (случай 1) и она же работает, если я закрываю комментарием строки

//m_callerWindowsIdentity = callerWindowsIdentity;
//m_wic = m_callerWindowsIdentity.Impersonate();

Код: c#
1.
conStr = "Data Source=SQLSRV\\SQL8R2;Initial Catalog=db12;Integrated Security=True;Pooling=True;Connect Timeout=60;Application Name=\"Service\""




Ошибка:

автор{"Could not load file or assembly 'System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. Exception from HRESULT: 0x80070542":"System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"} System.Exception {System.IO.FileLoadException}

При этом юзер u2 на своей локальной машине m2 с такой же строкой коннектится к запущенному на m2 тоже нормально.

Подумал, что может что-то с правами юзера на чужой машине?... но что?
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709291
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneWinnipuh2. Клиент на машине m2 запускается юзером u2
WinnipuhДоменный юзер u2 входит в Администраторы на компьютере m1.

ну так комп то другой, кто там у вас этот u2 на машине m2 ?

это локальная машина для этого юзера, каждый юзер на своей машине администратор, но локально все работает, если клиент и сервис на той же машине
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709293
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а компы m1 и m2 в одном домене?
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709297
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709327
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа компы m1 и m2 в одном домене?

да, один домен.
Если к примеру включаю basicHttp - все работает.
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709342
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что интересно: когда я даю домен\имя+ пароль того же проблемного юзера u2 и делаю в сервисе на m1 явную имперсонификацию

То есть вместо
Код: c#
1.
2.
 m_callerWindowsIdentity = callerWindowsIdentity;
 m_wic = m_callerWindowsIdentity.Impersonate();



делаю так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
		_wic = WindowsIdentity.Impersonate(IntPtr.Zero);
                // do logon & impersonate
                if (Win32NativeMethods.LogonUser(userName, domainName, password,
                (int)logonType, (int)logonProvider, ref logonToken) != 0)
                {
                    m_WindowsIdentiy = new WindowsIdentity(logonToken);
                }
                else
                    throw new Win32Exception(Marshal.GetLastWin32Error());



в результате текущим юзером в обоих случаях является нужный юзер u2, но во втором случае все работает и нет ошибки загрузки ассембли
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709343
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если захостить сервис как положено?
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709354
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа если захостить сервис как положено?

Попробую, но под ИИС он не работал тоже...
У меня два варианта хостинга: windows service и под IIS.
В консольном варианте я в состоянии в отладчике посмотреть, да и нет причины не работать по идее...

Кроме того что получается: один и тот же юзер коннектнутый с другого компьютера работает, если делать имперсонификацию с созданием логона и не работает, если сделать "по-быстрому", при всех остальных равных условиях.
При этом причина ошибки во втором случае - "нельзя загрузить ассембли из-за имперсонификации"

Значит есть разница в этих двух метода имперсонификации? ...
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709358
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем вообще там смена пользовательского контекса в открытии соединения?
если захостить на IIS или как windows service, то нужно в настройках сервиса указать конкретную учётку, которая имеет доступ на SQL и все дела (в случае IIS её навешивать на pool)
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709376
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа зачем вообще там смена пользовательского контекса в открытии соединения?
если захостить на IIS или как windows service, то нужно в настройках сервиса указать конкретную учётку, которая имеет доступ на SQL и все дела (в случае IIS её навешивать на pool)

Нужно, чтобы запросы выполнялись от определенного юзера, тогда учитываются его права на Sql Server.
В случае basicHttp - я делаю создание логина при помощи переданного юзером домен\имя, пароль и имперсонейт, как описано выше, все работает.
Но когда юзер хочет использовать netTcp - я беру юзера из контекста и поскольку пароля нет делаю имперсонейт так

m_callerWindowsIdentity = callerWindowsIdentity;
m_wic = m_callerWindowsIdentity.Impersonate();

Ну вот такая вот фигня.

Что-то не так в этом случае, какой-то "недоделанный" юзер получается
А в чем недоделанность - не пойму...
...
Рейтинг: 0 / 0
Почему так работает SqlConnection?
    #38709427
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему так работает SqlConnection?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]