Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
göndermesine yapılan geri çağırma, özgün uygulama veya betik tarafından yapılan zaman uyumsuz çağrının bir sonucu olmayabileceğinden, zaman uyumsuz çağrılar ciddi güvenlik riskleri oluşturur. Uzak bağlantılarda güvenlik, istemci ile uzak bilgisayardaki sağlayıcı arasındaki iletişimin şifrelenmesini temel alır. C++ içinde, coInitializeSecurityçağrısında kimlik doğrulama düzeyi parametresi aracılığıylaşifreleme ayarlayabilirsiniz. Betik yazarken, AuthenticationLevel değerini moniker bağlantısında veya SWbemSecurity nesnesinde ayarlayın. Daha fazla bilgi için bkz. VBScript kullanarak Varsayılan İşlem Güvenlik Düzeyini Ayarlama.
Zaman uyumsuz çağrılar için güvenlik riskleri vardır çünkü WMI, geri çağrı başarılı olana kadar geri çağrıda kimlik doğrulama düzeyini düşürdüğünden. Giden zaman uyumsuz bir çağrıda, istemci WMI bağlantısında kimlik doğrulama düzeyini ayarlayabilir. WMI, istemci çağrısındaki güvenlik ayarlarını alır ve aynı kimlik doğrulama düzeyiyle geri aramayı dener. Geri arama, her zaman RPC_C_AUTHN_LEVEL_PKT_PRIVACY düzeyinde başlatılır. Geri çağırma başarısız olursa, WMI gerekirse geri çağırmanın başarılı olabilmesi için kimlik doğrulama düzeyini RPC_C_AUTHN_LEVEL_NONEdüzeyine düşürür. Kimlik doğrulama hizmetinin Kerberos olmadığı yerel sistem içindeki çağrılar bağlamında, geri çağırma her zaman RPC_C_AUTHN_LEVEL_NONEkonumunda döndürülür.
En düşük kimlik doğrulama düzeyi RPC_C_AUTHN_LEVEL_PKT (wbemAuthenticationLevelPkt betik için). Ancak, RPC_C_AUTHN_LEVEL_PKT_PRIVACY (wbemAuthenticationLevelPktPrivacy) gibi daha yüksek bir düzey belirtebilirsiniz. İstemci uygulamalarının veya betiklerinin kimlik doğrulama düzeyini RPC_C_AUTHN_LEVEL_DEFAULT (wbemAuthenticationLevelDefault) olarak ayarlaması önerilir. Bu, kimlik doğrulama düzeyinin sunucu tarafından belirtilen düzeye kadar üzerinde anlaşmaya varılmasını sağlar.
HKEY_LOCAL_MACHINE\Software\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault kayıt defteri değeri WMI'nin geri aramalarda kabul edilebilir bir kimlik doğrulama düzeyi olup olmadığını denetler. Bu, betik veya Visual Basic'te yapılan zaman uyumsuz çağrılar için 'sink' güvenliğini korumaya yönelik tek mekanizmadır. Varsayılan olarak, bu kayıt defteri anahtarı sıfır olarak ayarlanır. Kayıt defteri anahtarı sıfırsa WMI kimlik doğrulama düzeylerini doğrulamaz. Betik yazarken zaman uyumsuz çağrıların güvenliğini sağlamak için kayıt defteri anahtarını 1 olarak ayarlayın. C++ istemcileri havuza erişimi denetlemek için IWbemUnsecuredApartment::CreateSinkStub çağırabilir. Değer varsayılan olarak herhangi bir yerde oluşturulur.
Aşağıdaki konular zaman uyumsuz çağrı güvenliği ayarlama örnekleri sağlar:
- VBScript'te Asenkron Bir Çağrıda Güvenliği Ayarlama
- C++ dilinde Zaman Uyumsuz Çağrı Güvenliği Ayarlama
C++ dilinde Zaman Uyumsuz Çağrı Güvenliği Ayarlama
IWbemUnsecuredApartment::CreateSinkStub yöntemi, IUnsecuredApartment::CreateObjectStub yöntemine benzer ve geri çağırmaları almak için Unsecapp.exeayrı bir işlemde havuz oluşturur. Ancak, CreateSinkStub yöntemi, ayrı işlemin erişim denetimini nasıl işlediğini belirten bir dwFlagparametresine sahiptir.
dwFlag parametresi, Unsecapp.exeiçin aşağıdaki eylemlerden birini belirtir:
- Erişimin denetlenip denetlenmeyeceğini belirlemek için kayıt defteri anahtarı ayarını kullanın.
- Kayıt defteri anahtarını yoksayın ve erişimi her zaman denetleyin.
- Kayıt defteri anahtarını yoksayın ve erişimi hiçbir zaman denetlemeyin.
Bu konudaki kod örneği, doğru şekilde derlenebilmek için aşağıdaki #include deyimini gerektirir.
#include <wbemidl.h>
Aşağıdaki yordamda, IWbemUnsecuredApartmentile zaman uyumsuz bir çağrının nasıl yapılacağı açıklanır.
IWbemUnsecuredApartment ile zaman uyumsuz çağrı gerçekleştirmek için
CoCreateInstanceçağrısıyla ayrılmış bir işlem oluşturun.
Aşağıdaki kod örneği, ayrılmış bir işlem oluşturmak için CoCreateInstance çağırır.
CLSID CLSID_WbemUnsecuredApartment; IWbemUnsecuredApartment* pUnsecApp = NULL; CoCreateInstance(CLSID_WbemUnsecuredApartment, NULL, CLSCTX_LOCAL_SERVER, IID_IWbemUnsecuredApartment, (void**)&pUnsecApp);Lavabo nesnesini oluştur.
Aşağıdaki kod örneği yeni bir havuz nesnesi oluşturur.
CMySink* pSink = new CMySink; pSink->AddRef();Lavabo için bir bağlantı ucu oluşturun.
Saplama, havuzdan üretilen bir sarmalayıcı işlevidir.
Aşağıdaki kod örneği havuz için bir saplama oluşturur.
LPCWSTR wszReserved = NULL; IWbemObjectSink* pStubSink = NULL; IUnknown* pStubUnk = NULL; pUnsecApp->CreateSinkStub(pSink, WBEM_FLAG_UNSECAPP_CHECK_ACCESS, //Authenticate callbacks regardless of registry key wszReserved, &pStubSink);Lavabo nesnesi işaretçisini serbest bırakın.
Saptama artık işaretçiye sahip olduğundan nesne işaretçisini serbest bırakabilirsiniz.
Aşağıdaki kod örneği nesne işaretçisini serbest bırakır.
pSink->Release();Zaman uyumsuz çağrılarda saplama kullanın.
Çağrıyı bitirdiğinizde yerel referans sayısını serbest bırakın.
Aşağıdaki kod örneği zaman uyumsuz bir çağrıda saplama kullanır.
// pServices is an IWbemServices* object pServices->CreateInstanceEnumAsync(strClassName, 0, NULL, pStubSink);Bazen, aramayı yaptıktan sonra zaman uyumsuz bir aramayı iptal etmek zorunda olabilirsiniz. Aramayı iptal etmeniz gerekiyorsa, çağrıyı ilk çağrıyı yapan işaretçiyle iptal edin.
Aşağıdaki kod örneği, zaman uyumsuz bir çağrının nasıl iptal edileceğini açıklar.
pServices->CancelAsyncCall(pStubSink);Asenkron çağrıyı kullanmayı bitirdiğinizde yerel başvuru sayısını serbest bırakın.
pStubSink işaretçisini yalnızca zaman uyumsuz çağrının iptal edilmesi gerekmediğini onayladıktan sonra serbest bırakın. Ayrıca, WMI pSink havuz işaretçisini serbest bıraktıktan sonra pStubSink'i serbest bırakmayın. pSink sonra pStubSink serbest bırakılması, hem havuzun hem de saplamanın sonsuza kadar bellekte kaldığı döngüsel bir başvuru sayısı oluşturur. Bunun yerine, işaretçiyi serbest bırakmak için olası bir yer, WMI tarafından özgün zaman uyumsuz çağrının tamamlandığını bildirmek amacıyla yapılan IWbemObjectSink::SetStatus çağrısındadır.
İşiniz bittiğinde, COM'u Release()ile devreden çıkarın.
Aşağıdaki kod örneğinde, pUnsecApp işaretçisinde Release() nasıl çağrılacakları gösterilmektedir.
pUnsecApp->Release();
CoInitializeSecurity işlevi ve parametreleri hakkında daha fazla bilgi için COM belgelerine bakın.