Используется сервер приложений на COM+ в домене на W2k
в сетке есть клиенты W2k и Win98, но можно всех перевести на W2k.
Так вот как определить имя компа, который сделал вызов моего сервера (если это вообще возможно)?
Дело в том, что у нас к компам в базе привязаны разные ресурсы (рекламные телефоны например) и нужно выдавать на клиента инфу только о них, при этом секретари постоянно разные и к логинам подвязаться очень затруднительно .
Передавать имя компа с клиента при вызове метода тоже очень не хочется.
У Д. Бокса есть фак на эту тему, где говорится, что простым способом нет. Можно в RPC пакете при вызове цеплять свои параметры, а на сервере их читать, но если твоё приложение работает в внутренней сети гораздо проще передавать имя или IP в одном из вызовов.
ЗЫ: Адрес статьи не нашёл, но в этом форуме она где то точно была...
Здравствуйте Tom, Вы писали:
Tom>У Д. Бокса есть фак на эту тему, где говорится, что простым способом нет. Можно в RPC пакете при вызове цеплять свои параметры, а на сервере их читать, но если твоё приложение работает в внутренней сети гораздо проще передавать имя или IP в одном из вызовов.
То есть вообще не существует нормального метода
Цеплять в RPC свои пакеты всеравно не надежно. Мне желательно уберечся от возможности подмены вызова, а то любой продвинутый пользователь сможет вытянуть информацию для него совсем не предназначенную, написав простенькое приложение на томже VB, причем права у него на это будут.
Конечно корни проблемы в организации информации, но мне трудно представить какой-то еще метод вытягивать информацию нужную (достаточно надежно) на этом компе, при том что работающие секретари постоянно меняются.
Здравствуйте Tom, Вы писали:
Tom>У Д. Бокса есть фак на эту тему, где говорится, что простым способом нет. Можно в RPC пакете при вызове цеплять свои параметры, а на сервере их читать, но если твоё приложение работает в внутренней сети гораздо проще передавать имя или IP в одном из вызовов.
Можно создать OBJREF моникер, преобразовать его в строку (в ней будет вся информация необходимая для подключения к удаленному объекту), раскодировать полученный base64... Есть очень большая доля вероятности, что где-то там будет если не имя машины то, хотя-бы ее IP адрес.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте OldRick, Вы писали:
OR>Используется сервер приложений на COM+ в домене на W2k OR>в сетке есть клиенты W2k и Win98, но можно всех перевести на W2k.
OR>Так вот как определить имя компа, который сделал вызов моего сервера (если это вообще возможно)? OR>Дело в том, что у нас к компам в базе привязаны разные ресурсы (рекламные телефоны например) и нужно выдавать на клиента инфу только о них, при этом секретари постоянно разные и к логинам подвязаться очень затруднительно . OR>Передавать имя компа с клиента при вызове метода тоже очень не хочется.
DWORD dwAuthnSvc;
OLECHAR *pszPrincipal;
if (SUCCEEDED(::CoQueryClientBlanket(&dwAuthnSvc, 0, 0, 0, 0,
reinterpret_cast<RPC_AUTHZ_HANDLE*>(&pszPrincipal), 0))
&& (RPC_C_AUTHN_WINNT == dwAuthnSvc || RPC_C_AUTHN_GSS_KERBEROS == dwAuthnSvc))
{
pszPrincipal; // principal name here
}
ME> DWORD dwAuthnSvc;
ME> OLECHAR *pszPrincipal;
ME> if (SUCCEEDED(::CoQueryClientBlanket(&dwAuthnSvc, 0, 0, 0, 0,
ME> reinterpret_cast<RPC_AUTHZ_HANDLE*>(&pszPrincipal), 0))
ME> && (RPC_C_AUTHN_WINNT == dwAuthnSvc || RPC_C_AUTHN_GSS_KERBEROS == dwAuthnSvc))
ME> {
ME> pszPrincipal; // principal name here
ME> }
ME>
Пасиба
Единственное ограничение, на сколько я понял, что в сетке должны быть только W2k так как керберос разрешен только в этих сетях, а в NTLM принципала нет в принципе (я всегда по наивности считал что принципалом в данном случае будет имя пользователя, как говорится ответ под носом был ).
Только вот если используется делегирование прав клиента и вызванный сервер обращается на второй сервер, то тот, второй, в качестве имени принципала получит клиента или первый сервер?
Имя принципиала это абсолютно не то. Я свободно напишу приложение, которое будет пихать туда что угодно. Имя принципиала задаётся клиентом при вызове IClientSecurity::SetBlanket
[MSDN]
pServerPrincName
[in] Pointer to a WCHAR string that indicates the server principal name to use with the authentication service. If COLE_DEFAULT_PRINCIPAL is specified, DCOM will pick a principal name using its security blanket negotiation algorithm. If Kerberos is used as the authentication service, this parameter must be the correct principal name of the server or the call will fail.
[/MSDN]
Здравствуйте Tom, Вы писали:
Tom>Имя принципиала это абсолютно не то. Я свободно напишу приложение, которое будет пихать туда что угодно. Имя принципиала задаётся клиентом при вызове IClientSecurity::SetBlanket
Абсолютно верно.
Кроме того, имя машины можно достать из имени принципала только если это рабочая группа. Если это домен, то именем принципала будет Имя_Контроллера_Домена/Имя_Юзера.
Здравствуйте MaximE, Вы писали:
Tom>>Имя принципиала это абсолютно не то. Я свободно напишу приложение, которое будет пихать туда что угодно. Имя принципиала задаётся клиентом при вызове IClientSecurity::SetBlanket
ME>Абсолютно верно. ME>Кроме того, имя машины можно достать из имени принципала только если это рабочая группа. Если это домен, то именем принципала будет Имя_Контроллера_Домена/Имя_Юзера.
Значит я всетаки не так наивен как полагал
В рабочей группе понятное дело сравнивается имя пользователя и пароль с именем и паролем вызывающего сервера и нет никакого смысла пихать туда имя юзера, важен как раз комп. А имя юзера проще через имперсонацию узнать. Всетаки странно что MS так относится к статическим объектам. Видимо придется пересмотреть хранение привязок в БД.
Я раньше использовал Borland Socket Server, соответсвенно немного докрученный, благо исходники поставляются вместе с Delphi, но он много чего вкусного не умеет, а докручивать его до состояния близкого к COM+ заянятие неблагодарное.
Может кто-нибудь использовал MS AppServer который расширяет COM+? Может он позволяет более детально рассматривать клиента...
Здравствуйте OldRick, Вы писали:
OR>Здравствуйте MaximE, Вы писали:
Tom>>>Имя принципиала это абсолютно не то. Я свободно напишу приложение, которое будет пихать туда что угодно. Имя принципиала задаётся клиентом при вызове IClientSecurity::SetBlanket
ME>>Абсолютно верно. ME>>Кроме того, имя машины можно достать из имени принципала только если это рабочая группа. Если это домен, то именем принципала будет Имя_Контроллера_Домена/Имя_Юзера.
OR>Значит я всетаки не так наивен как полагал OR>В рабочей группе понятное дело сравнивается имя пользователя и пароль с именем и паролем вызывающего сервера и нет никакого смысла пихать туда имя юзера, важен как раз комп. А имя юзера проще через имперсонацию узнать. Всетаки странно что MS так относится к статическим объектам. Видимо придется пересмотреть хранение привязок в БД.
Немного не так. Имя принципала — это имя машины где юзер залогинился + имя юзера. В рабочей группе юзеры логинятся локально — в этом случае мы имеем в имени принципала имя машины юзера. В домене юзеры логинятся на серваке — именем машины в имени принципала будет этот сервер.
ME>Немного не так. Имя принципала — это имя машины где юзер залогинился + имя юзера. В рабочей группе юзеры логинятся локально — в этом случае мы имеем в имени принципала имя машины юзера. В домене юзеры логинятся на серваке — именем машины в имени принципала будет этот сервер.
Всё же опять не много не так. Имя принципиала это всё, что угодно, что используется для аутентификации.
Здравствуйте Tom, Вы писали:
ME>>Немного не так. Имя принципала — это имя машины где юзер залогинился + имя юзера. В рабочей группе юзеры логинятся локально — в этом случае мы имеем в имени принципала имя машины юзера. В домене юзеры логинятся на серваке — именем машины в имени принципала будет этот сервер. Tom>Всё же опять не много не так. Имя принципиала это всё, что угодно, что используется для аутентификации.
Стоит добавить, в зависимости от ее типа =)
Кстати, я правда не проверял, по моему если использовать керберос или Snego имя принципала на клиенте поменять нельзя, он должен ругнуться.
Здравствуйте Tom, Вы писали:
Tom>Вообще я думаю ответ надо искать в недрах АПИ PRC.
Да это понятно, но всегда стремно работать на достаточно низком уровне не зная не пофиксит ли твои старания MS своим следующим сервис паком или релизом OS.
Здравствуйте Tom, Вы писали:
Tom>Всё же опять не много не так. Имя принципиала это всё, что угодно, что используется для аутентификации.
Посыпаю голову пеплом : security principal name
A name that uniquely identifies a user, group, or computer within a single domain. This name is not guaranteed to be unique across domains. See also security principal.