में अलग क्लोकिंग/प्रतिरूपण मैं DCOM के साथ दो बातें (प्रक्रिया से बाहर)उपयोग डिफ़ॉल्ट प्रमाणीकरण और DCOM कॉल
- प्रक्रिया विस्तृत CoInitializeSecurity और उसके पैरामीटर pAuthList का उपयोग कर प्रमाणीकरण सेट प्राप्त कोशिश कर रहा हूँ।
- विशेष स्थितियों में फोन करने वाले की पहचान (COM कॉल)
मेरे विचार बदलने के लिए क्लोकिंग का उपयोग करना:
प्रमाणन जानकारी संरचना AFAIK डिफ़ॉल्ट प्रमाणीकरण जानकारी (RPC_C_AUTHN_WINNT के लिए उपयोगकर्ता नाम और पासवर्ड की तरह होता है) सभी नए COM कॉल के लिए। तो प्रक्रिया टोकन की बजाय ऑथ संरचना में जानकारी COM द्वारा उपयोग की जानी चाहिए। हालांकि, सभी COM कॉल/कनेक्शन हमेशा लागू डिफ़ॉल्ट की बजाय प्रक्रिया 'पहचान का उपयोग कर रहे हैं।
आमतौर पर, कोई प्रॉक्सी के लिए ऑथ जानकारी बदलने के लिए CoSetProxyBlanket का उपयोग कर सकता है। यह मेरे लिए काम करता है। मेरा सवाल यह है कि क्या मैं टोकन का प्रतिरूपण करता हूं और COM फ़ंक्शन को कॉल करता हूं, तो यह काम करना चाहिए या नहीं। मैंने विभिन्न एमएसडीएन लेखों में पढ़ा है जो CoOitializeSecurity को EOAC_DYNAMIC_CLOAKING को लागू करने से इसे काम करना चाहिए। लेकिन, मेरा मैन्युअल रूप से "प्रतिरूपित कॉम हमेशा कहता सर्वर साइड पर प्रक्रिया पहचान को दर्शाता है।
ग्राहक इस (डेल्फी) की तरह लग रहा
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 का उपयोग करता है। यह authInfo (SEC_WINNT_AUTH_IDENTITY_W संरचना के रूप में) प्राप्त करने के लिए CoQueryClientBlanket का भी उपयोग करता है। हालांकि दोनों कॉल हमेशा क्लाइंट की प्रक्रिया पहचान वापस करते हैं।
मैन्युअल रूप से प्रतिरूपण भी काम नहीं करता है (2):
Token := TJwSecurityToken.CreateLogonUser(authidentity.User, '', authidentity.Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT);
Token.ImpersonateLoggedOnUser;
int := CoSecurityTestObj.Create;
int.TestCall;
सवाल फिर से:
मैं गलत हूँ या क्यों डिफ़ॉल्ट प्रमाणन जानकारी संरचना (WinNT उपयोगकर्ता नाम और पासवर्ड के साथ) में डिफ़ॉल्ट प्रमाणीकरण के रूप में इस्तेमाल नहीं किया है प्रत्येक COM कनेक्शन/कॉल?
क्या मैं गलत हूं या मैन्युअल प्रतिरूपण क्यों नहीं करता? ध्यान रखें कि मैंने संख्या 2 का परीक्षण किया है। अलग-अलग संख्या 1. हस्तक्षेप नहीं कर सकता है।
जेडीआई विंडोज सुरक्षा कोड लाइब्रेरी के लिए यह मूल कार्य है जिसे मैं COM सुरक्षा का समर्थन करने के लिए विस्तारित करता हूं। तो आपकी मदद जीपीएल/एमपीएल जायेगी।
संदर्भ:
क्लोकिंग:
- http://msdn.microsoft.com/en-us/library/ms683778%28VS.85%29.aspx
- http://msdn.microsoft.com/en-us/library/cc246058%28PROT.10%29.aspx
- http://alt.pluralsight.com/wiki/default.aspx/Keith.GuideBook/WhatIsCoInitializeSecurity.html
CoInitializeSecurity और pAuthInfo
(सर्वर साइड) सुरक्षा कंबल हो रही
हल संख्या # 2। निरंतर EOAC_DYNAMIC_CLOAKING को गलत परिभाषित किया गया था। * stupidme * – ChristianWimmer
मामले में 1. इसे वर्तमान पहचान का उपयोग करना चाहिए, लेकिन केवल तभी जब यह इसे प्रतिनिधि करने में सक्षम हो, जो केवल केर्बेरोज i.e. डोमेन वातावरण में है। इसके अलावा प्रक्रिया पहचान "प्रतिनिधिमंडल के लिए भरोसेमंद" होना चाहिए। यदि कोई रिमोट क्लाइंट है और आप किसी अन्य सर्वर (2 होप्स) पर कॉल करने का प्रयास कर रहे हैं तो विरासत एनटीएलएम प्रमाणीकरण इसकी अनुमति नहीं देगा। – Ben