Все трое на разных машинах. На всех машинах — W2k.
Клиент = скрипт.vbs, вызывающий метод COM+, который коннектится через ADO к SQL-серверу.
СOM+ приложение работает под аккаунтом, который Trusted for delegation.
Право на доступ к базе у пользователя, запускающего скрипт, точно есть.
Уровень аутентификации COM+ приложения — Packet Privacy, уровень олицетворения — Delegate.
SQL-сервер работает со встроенной в Windows безопасностью.
Необходимо:
коннект к SQL-серверу должен происходить с контекстом безопасности клиента.
Однако такого не происходит, вываливается ошибка (при коннекте к SQL-серверу из COM+ rjvgjytynf):
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
Что мне надо писать в методе компонента, делающего коннект к базе ????
Что написано сейчас:
1) клиент (примерно) :
Dim oDL, oCon, sClasses, oTest, sConn
Set oDL = CreateObject ("DataLinks")
Set oCon = oDL.PromptNew
' вызываем компонент
Set oTest = CreateObject ("COMPComps2.COMPTest")
sConn = oCon.ConnectionString
' должны получить строку из базы от компонента
sClasses = oTest.GetClasses (sConn)
MsgBox sClasses, vbExclamation
2) метод GetClasses кокласса COMPComps2.COMPTest (примерно):
STDMETHODIMP CCOMPTest::GetClasses(BSTR strConnectStr, BSTR* pClasses)
{
// TODO: Add your implementation code here
try
{
::CoImpersonateClient ();
// коннектимся к базе со строкой strConnectStr и берем оттуда к-нибудь данные
Здравствуйте, Vovaman, Вы писали:
V>Проблема:
V>Клиент --> COM+ компонент --> SQL Server
V>Все трое на разных машинах. На всех машинах — W2k. V>Клиент = скрипт.vbs, вызывающий метод COM+, который коннектится через ADO к SQL-серверу. V>СOM+ приложение работает под аккаунтом, который Trusted for delegation. V>Право на доступ к базе у пользователя, запускающего скрипт, точно есть. V>Уровень аутентификации COM+ приложения — Packet Privacy, уровень олицетворения — Delegate. V>SQL-сервер работает со встроенной в Windows безопасностью.
Во первых здесь должно хватить Impersonate
А для Delegate надо еще знать настройки домена.
Здравствуйте, Ведмедь, Вы писали:
В>Здравствуйте, Vovaman, Вы писали:
V>>Проблема:
V>>Клиент --> COM+ компонент --> SQL Server
V>>Все трое на разных машинах. На всех машинах — W2k. V>>Клиент = скрипт.vbs, вызывающий метод COM+, который коннектится через ADO к SQL-серверу. V>>СOM+ приложение работает под аккаунтом, который Trusted for delegation. V>>Право на доступ к базе у пользователя, запускающего скрипт, точно есть. V>>Уровень аутентификации COM+ приложения — Packet Privacy, уровень олицетворения — Delegate. V>>SQL-сервер работает со встроенной в Windows безопасностью.
В>Во первых здесь должно хватить Impersonate В>А для Delegate надо еще знать настройки домена.
1) Какие настройки домена влияют на Delegate?
2) Impersonate хватило бы только тогда, когда SQL-сервер работает с COM+ компонентом на одной машине
В>>Во первых здесь должно хватить Impersonate В>>А для Delegate надо еще знать настройки домена.
V>1) Какие настройки домена влияют на Delegate?
Домен должен быть 2000 и выше, включен Керберос, а не NTLM. Остальное не знаю.
V>2) Impersonate хватило бы только тогда, когда SQL-сервер работает с COM+ компонентом на одной машине
Если получится все, то можешь описать, что именно ты настраивал?
Здравствуйте, Ведмедь, Вы писали:
В>Здравствуйте, Vovaman, Вы писали:
В>>>Во первых здесь должно хватить Impersonate В>>>А для Delegate надо еще знать настройки домена.
V>>1) Какие настройки домена влияют на Delegate?
В>Домен должен быть 2000 и выше, включен Керберос, а не NTLM. Остальное не знаю.
V>>2) Impersonate хватило бы только тогда, когда SQL-сервер работает с COM+ компонентом на одной машине
В>Если получится все, то можешь описать, что именно ты настраивал?
Домен 2000, Kerberos включен, но чего-то не хватает.
Попробовал, когда SQL-сервер на той же машине, что и COM+ компонент — все в порядке, коннект к SQL-серверу приходит под аккаунтом клиента, хоть компонент работает под другим аккаунтом — все как надо.
Но если SQL на другой машине — контекст не передается.
Тут, похоже, два возможных решения:
1) либо недонастроил включение Kerberos'а (хотя все галки выставлял, как в статье MSDN написано)
2) либо надо вызвать в компоненте что-то типа CoSetProxyBlanket перед коннектом к базе.
Я когда журнал сообщений смотрел на машине, где компонент крутится, то последовательность была такая:
а) нормальный логон клиента на машину компонента, где крутится компонент (пакет проверки — керберос)
б) неверный логон аккаунта, под которым работает компонент на ту же машину и пакет проверки уже — Negotiate