首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在DCOM调用中使用默认身份验证和单独隐藏/模拟

在DCOM调用中使用默认身份验证和单独隐藏/模拟
EN

Stack Overflow用户
提问于 2010-01-03 01:55:48
回答 1查看 2.3K关注 0票数 42

我正在尝试用DCOM实现两件事(进程之外)

使用pAuthList.

  • Using及其参数
  1. 设置进程范围的身份验证,以在特殊情况下更改调用者的身份(COM调用)

我的想法:

  1. AFAIK auth结构包含所有新COM调用的默认身份验证信息(如用户名和RPC_C_AUTHN_WINNT密码)。因此,COM应该使用auth结构中的信息,而不是进程令牌。然而,所有的COM调用/连接总是使用进程的标识,而不是应用的默认身份。
  2. 通常可以使用CoSetProxyBlanket来更改代理的auth信息。这对我有用。我在这里的问题是,如果我自己模拟令牌并调用COM函数,它是否必须工作。我在多篇MSDN文章中读到,将EOAC_DYNAMIC_CLOAKING应用于CoInitializeSecurity应该能使其工作。但是,我手动“模拟的COM调用总是显示服务器端的进程标识。

客户端看起来像这样(德尔菲)

代码语言:javascript
复制
var
authList : SOLE_AUTHENTICATION_LIST;
authidentity : SEC_WINNT_AUTH_IDENTITY_W;
authInfo : array[0..1] of SOLE_AUTHENTICATION_INFO;

pcAuthSvc : DWORD;
asAuthSvc : array[0..0] of SOLE_AUTHENTICATION_SERVICE;
Token : TJwSecurityToken;

begin
ZeroMemory( @authidentity, sizeof(authidentity) );

authidentity.User := 'Testbenutzer';
authidentity.UserLength := Length('Testbenutzer');
authidentity.Domain := '';
authidentity.DomainLength := 0;
authidentity.Password := 'test';
authidentity.PasswordLength := 4;
authidentity.Flags := SEC_WINNT_AUTH_IDENTITY_UNICODE;


ZeroMemory( @authInfo, sizeof( authInfo ) );

// NTLM Settings
authInfo[0].dwAuthnSvc := RPC_C_AUTHN_WINNT;
authInfo[0].dwAuthzSvc := RPC_C_AUTHZ_NONE;
authInfo[0].pAuthInfo := @authidentity;



authList.cAuthInfo := 1;
authList.aAuthInfo := @authInfo;

OleCheck(CoInitializeSecurity(
  NULL,                            // Security descriptor
  -1,                              // Count of entries in asAuthSvc
  NULL,                            // asAuthSvc array
  NULL,                            // Reserved for future use
  RPC_C_AUTHN_LEVEL_CONNECT,       // Authentication level
  RPC_C_IMP_LEVEL_IMPERSONATE,     // Impersonation level
  @authList,                       // Authentication Information
  DWORd(EOAC_DYNAMIC_CLOAKING),                       // Additional capabilities
  NULL                             // Reserved
  ));
//create COM object
int := CoSecurityTestObj.Create;
int.TestCall;

服务器还设置了标志EOAC_DYNAMIC_CLOAKING。它使用CoImpersonateClient来获取线程令牌和用户名。它还使用CoQueryClientBlanket来获取authInfo (作为SEC_WINNT_AUTH_IDENTITY_W结构)。但是,这两个调用总是返回客户端的进程标识。

此外,手动模拟也不起作用(2.):

代码语言:javascript
复制
Token := TJwSecurityToken.CreateLogonUser(authidentity.User, '', authidentity.Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT);
 Token.ImpersonateLoggedOnUser;
 int := CoSecurityTestObj.Create;
 int.TestCall;

再次提问:

  1. 我错了吗,或者为什么默认的auth信息结构(带有用户名和密码的WinNT)没有在每个COM连接/调用中用作默认身份验证?
  2. 是错的,还是为什么手动模拟不能工作?请注意,我分别测试了2号,所以1号不能干扰。

这是绝地Windows安全代码库的基本工作,我将其扩展到支持COM安全性。所以你的帮助会转到GPL/MPL。

参考文献:

隐身:

  1. http://msdn.microsoft.com/en-us/library/ms683778%28VS.85%29.aspx
  2. http://msdn.microsoft.com/en-us/library/cc246058%28PROT.10%29.aspx
  3. http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsCoInitializeSecurity.html

CoInitializeSecurity和pAuthInfo

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/93.htm

获得安全保护层(服务器端)

  1. http://www.codeguru.cn/vc&mfc/apracticalguideusingvisualcandatl/92.htm
EN

回答 1

Stack Overflow用户

发布于 2012-01-31 16:27:24

您试过用RPC_C_AUTHN_LEVEL_CALL而不是RPC_C_AUTHN_LEVEL_CONNECT调用RPC_C_AUTHN_LEVEL_CALL()吗?

通常,在创建DCOM客户端时,我会创建COSERVERINFO,并使用安全凭据传递给CoCreateInstanceEx(),记住在所有接口上调用CoSetProxyBlanket()。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1993651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档