Aracılığıyla paylaş


C++ Kullanarak Kimlik Doğrulamayı Ayarlama

WMI için IWbemLocator::ConnectServer ana görevlerinden biri, IWbemServices ara sunucusuna işaretçi döndürmektir. IWbemServices ara sunucusu aracılığıyla WMI altyapısının özelliklerine erişebilirsiniz. Ancak, IWbemServices proxy işaretçisi, IWbemServices işleminin kimliğine değil istemci uygulama işleminin kimliğine sahiptir. Bu nedenle, işaretçiyle IWbemServices'e erişmeye çalışırsanız, E_ACCESSDENIEDgibi erişim reddedilen bir kod alabilirsiniz. Erişim reddedildi hatasını önlemek için, yeni işaretçinin kimliğini CoSetProxyBlanket arabirimine bir çağrıyla ayarlamanız gerekir.

Sağlayıcı, ad alanına paket gizliliği (PktPrivacy) kullanmadığınız sürece hiçbir veri döndürülmeyecek şekilde güvenlik ayarlarını yapabilir. Bu, verilerin ağ üzerinden geçerken şifrelenmesini sağlar. Daha düşük bir kimlik doğrulama düzeyi ayarlamaya çalışırsanız erişim reddedildi iletisi alırsınız. Daha fazla bilgi için, Ad Alanı Güvenlik Tanımlayıcılarını Ayarlamabölümüne bakın.

Betiklerde kimlik doğrulama ayarlama hakkında daha fazla bilgi için bkz. VBScript kullanarak Varsayılan İşlem Güvenlik Düzeyini Ayarlama.

Uzak IUnknown Arabirimi Üzerinde Güvenliği Ayarlama

Bazı durumlarda, bir sunucuya yalnızca bir ara sunucu işaretçisinden daha fazla erişim gerekir. Bazen, proxy'nin IUnknown arabirimine güvenli bir bağlantı elde etmeniz gerekebilir. IUnknownkullanarak, arabirimler ve diğer gerekli teknikler için uzak sistemi sorgulayabilirsiniz.

Bir ara sunucu uzak bir bilgisayarda bulunduğunda, sunucu proxy'nin IUnknown arabirimine yapılan tüm çağrıları IUnknown arabirimine devreder. Örneğin, ara sunucuda QueryInterface çağırırsanız ve istenen arabirim ara sunucunun parçası değilse, ara sunucu çağrıyı uzak sunucuya gönderir. Buna karşılık, uzak sunucu uygun arabirim desteğini denetler. Sunucu arabirimi destekliyorsa COM, uygulamanın yeni arabirimi kullanabilmesi için istemciye yeni bir ara sunucu sıralar.

İstemci uzak sunucuya erişim izinlerine sahip değilse, ancak kullanan bir kullanıcının kimlik bilgilerini kullanıyorsa sorunlar ortaya çıkar. Bu durumda, uzak sunucudaki QueryInterface erişme girişimleri başarısız olur. Kullanıcının uzak sunucuya erişimi olmadığından proxy üzerindeki son yayın da başarısız olur. Bunun bir belirtisi, istemci uygulamasının son ara sunucu sürümünde başarısız olmasından önce bir veya iki saniyelik bir gecikmedir. Hata, COM'un sunucuya erişim izni veren değiştirilmiş kimlik bilgilerini içermeyen geçerli kullanıcının varsayılan güvenlik ayarlarını kullanarak uzak sunucuya erişmeye çalışmasından kaynaklanır. Daha fazla bilgi için bkz. IWbemServices ve Diğer Proxy'lerde Güvenliği Ayarlama.

Bağlantının başarısız olmasını önlemek için CoSetProxyBlanket kullanarak IUnknown'dan döndürülen işaretçide güvenlik kimlik doğrulamasını açıkça ayarlayın. CoSetProxyBlanketkullanarak, uzak sunucunun doğru kimlik doğrulama kimliğini aldığından emin olabilirsiniz.

Aşağıdaki kod örneği, uzaktaki IUnknown arabirimine erişmek için CoSetProxyBlanket kullanmanın nasıl olduğunu göstermektedir.

SEC_WINNT_AUTH_IDENTITY_W* pAuthIdentity = 
   new SEC_WINNT_AUTH_IDENTITY_W;
ZeroMemory(pAuthIdentity, sizeof(SEC_WINNT_AUTH_IDENTITY_W));

pAuthIdentity->User = new WCHAR[32];
StringCbCopyW(pAuthIdentity->User,sizeof(L"MyUser"),L"MyUser");
pAuthIdentity->UserLength = wcslen(pAuthIdentity->User);

pAuthIdentity->Domain = new WCHAR[32];
StringCbCopyW(pAuthIdentity->Domain,sizeof(L"MyDomain"),L"MyDomain");
pAuthIdentity->DomainLength = wcslen(pAuthIdentity->Domain);

pAuthIdentity->Password = new WCHAR[32];
pAuthIdentity->Password[0] = NULL;
pAuthIdentity->PasswordLength = wcslen( pAuthIdentity->Password);

pAuthIdentity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;

IWbemServices* pWbemServices = 0;

// Set proxy security
hr = CoSetProxyBlanket(pWbemServices, 
                       RPC_C_AUTHN_DEFAULT, 
                       RPC_C_AUTHZ_NONE, 
                       COLE_DEFAULT_PRINCIPAL, 
                       RPC_C_AUTHN_LEVEL_DEFAULT, 
                       RPC_C_IMP_LEVEL_IMPERSONATE, 
                       pAuthIdentity, 
                       EOAC_NONE 
);
if (FAILED(hr))
{
   cout << "Count not set proxy blanket. Error code = 0x"
        << hex << hr << endl;
   pWbemServices->Release();
   return 1;
}

// Set IUnknown security
IUnknown*    pUnk = NULL;
pWbemServices->QueryInterface(IID_IUnknown, (void**) &pUnk);

hr = CoSetProxyBlanket(pUnk, 
                       RPC_C_AUTHN_DEFAULT, 
                       RPC_C_AUTHZ_NONE, 
                       COLE_DEFAULT_PRINCIPAL, 
                       RPC_C_AUTHN_LEVEL_DEFAULT, 
                       RPC_C_IMP_LEVEL_IMPERSONATE, 
                       pAuthIdentity, 
                       EOAC_NONE 
);
if (FAILED(hr))
{
   cout << "Count not set proxy blanket. Error code = 0x"
        << hex << hr << endl;
   pUnk->Release();
   pWbemServices->Release();
   delete [] pAuthIdentity->User;
   delete [] pAuthIdentity->Domain;
   delete [] pAuthIdentity->Password;
   delete pAuthIdentity;   
   return 1;
}

// cleanup IUnknown
pUnk->Release();

//
// Perform a bunch of operations
//

// Cleanup
pWbemServices->Release();

delete [] pAuthIdentity->User;
delete [] pAuthIdentity->Domain;
delete [] pAuthIdentity->Password;

delete pAuthIdentity;

Not

Bir proxy'nin IUnknown arabiriminde güvenlik ayarladığınızda, COM, CoUninitializeçağrılana kadar serbest bırakılamayan bir proxy kopyası oluşturur.

 

WMI 'de Kimlik Doğrulamayı Ayarlama