我正在尝试用DCOM实现两件事(进程外)
我的想法:
AFAIK auth信息结构包含所有新COM调用的默认身份验证信息(如RPC_C_AUTHN_WINNT的用户名和密码).因此,COM应该使用auth结构中的信息而不是进程令牌.但是,所有COM调用/连接始终使用进程的标识而不是应用的默认标识.
通常,可以使用CoSetProxyBlanket来更改代理的身份验证信息.这适合我.我的问题是,如果我自己模仿令牌并调用COM函数,它是否必须工作.我已阅读各种MSDN文章,将EOAC_DYNAMIC_CLOAKING应用于CoInitializeSecurity应该可以使其正常工作.但是,我手动"模拟的COM调用始终在服务器端显示进程标识.
客户端看起来像这样(Delphi)
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 := …Run Code Online (Sandbox Code Playgroud)