Web Application ve Web Service Projelerinde Lobjects.exe yetkilendirme problemleri
Projelerde karşılaşılan ve bize sıkça iletilen Lobjectsin Web üzerinden çalıştırılmasıyla ilgili sorunların giderilmesi amacıyla oluşturulmuştur. Aslen konu bir DCOM nesnesinin sistemde yetkilendirilmesidir. Yapılan çalışmalarda konuyla ilgili Logo Objects’in web üzerinde çalıştırılamaması veya Windows Uygulama projelerinden farklı çalışması gibi herhangi bir probleme rastlanmamıştır. Dolayısıyla bu döküman bir DCOM nesnesinin IIS tarafından çalıştırılacak şekilde yetkilendirilmesi olarak bakılabilir.
Bu döküman aşağıdaki sorulara yanıt vermeyi amaçlamaktadır.
.NET Projemize Lobjects.exe’nin eklenmesi
64 Bit sistemlerde Lobjects.exe Register etmek
Logo Objects’e erişim haklarını vermek
Yetkilendirme probleminin tespiti
.NET Projemize Lobjects.exe’nin eklenmesi
Logo Objects düzgün bir şekilde register edildikten sonra projemize eklemek için “Solution Explorer” -> “References” iüzerinde Sağtuş -> “Add Reference” seçeneği ile açılan ekrandaki COM sekmesi altındaki “UnityObjects Library” componentini seçmeliyiz. Bu kısımda UnityApplication isimli bir component daha gözükmesi mümkündür. Ancak bizim kullanacağımız UnityObjects Library’dir. Bu seçimi yaparken Path kısmında bizim register etmeye çalıştığımız Lobject.EXE’nin path bilgisinin de doğru olduğuna emin olmalıyız.
(Not 1 : forwebuse ve Lgold.ini ayarları script bazlı asp sayfaları için geçerliydi. .NET ile geliştirdiğimiz Web projelerinde bu metod ve işlemlere ihtiyacımız duyulmuyor. .NET projeleri için Lobjects özelinde Windows uygulaması geliştirme işleminden farklı bir yaklaşım bulunmuyor.)
(Not 2 : Logo seti ile IIS aynı sistemde bulunmalı (map olarak değil, fiziksel olarak aynı sistemde bulunmalı). Bunun sebebi ise Lobjectsin ihtiyaç duyacağı resource dosyalarına yetki problemlerine takılmadan erişebilmesinin sağlanmasıdır.)
(Not 3 : Kesinlikle Browse ederek Lobjects.exe yi seçmiyoruz. Lobjects’in bu şekilde projeye eklenmesi hem projenin farklı sistemlere taşınmasında hemde versiyon değişimlerinde sıkıntı yaratmaktadır)
64 Bit sistemlerde Lobjects.exe Register etmek
64 Bit sistemlerde Lobjects.exe register edilirken bazı yetki sorunları ile karşılaşmamız mümkün. Bunu aşmak için admin kullanıcı ile register işleminin gerçekleşmesi gerekiyor. Aşağıdaki şekilde register işlemi administrator kullanıcı ile yapılabilir.
1 – Masaüstünde aşağıdaki gibi bir kısayol tanımlayalım.
2 – Lobjects.exe üzerinde sağ tuş \ Properties ile ulaştığımız ekrandaki aşağıdaki işaretin olduğuna emin olalım.
3 – Oluşturduğumuz bu kısayolun sağ tuş menüsündeki “Run as Administrator” seçeneği ile çalıştıralım.
Logo Objects’e erişim haklarını vermek
Lobjects.exe çalıştırılabilmesi için bazı ayarların yapılması gerekmektedir. İstemci üzerinden erişim sağlayacak Internet User’ ına, kurulum esnasında register edilen “Lobjects.exe”ye erişim hakkı verilmelidir. Aşağıda yetkilendirme için kullanılacak 3 farklı yöntem belirtilmiştir.
1 – DCOM Config
Administrative Tools -> Component Services -> My computer -> DCOM Config modülleri takip edilerek veya Start -> Run ekranına “dcomconfig” yazarak Configuration Services ekranına ulaşabilirsiniz.
64 bit işletim sistemlerinde DCOMCnfg ile sadece 64Bit üretilen COM nesneleri görüntülenmektedir. Dolayısıyla Logo Objects için GUID bilgileri görünmeyebilir. Aşağıda anlatılan işlemleri Run (Çalıştır) kısmına “comexp.msc /32” yazdığınızda açılan “Component Services” kısmından da yapabilirsiniz.
Lobjects.exe düzgün register edildiyse aşağıdaki ekranda görülen yolda ilgili GUID görünüyor olmalı;
(Not : Logo Objects’in GUID bilgisi set versiyonuna göre şunlarda olabilir;
{20582BE2-1F5B-11D2-A896-006097EFAA06} -> LogoObjects.exe - Lengine1.exe
{00CDA438-213D-47A3-AF3E-13DB9290D2A0} -> LogoObjects.exe
LObjects.exe için "{059C1939-...."
{06E05183-CEDE-4904-B42A-B99CBBE0BD7D} -> HRObjects.exe
{1D7D42ED-9F52-46E4-8446-FD1974141EFF} -> ik.exe)
GUID üzerinde sağtuş -> Properties ile yetkilendirme ekranı açılır ve aşağıdaki adımlar takip edilir;
- “General” tabında “Authentication Level”, “None” olarak belirlenir,
- “Location” tabında “Run application on this computer” seçilir,
- “Security” tabında aşağıdaki ayarlar gerçekleştirilir.
o “Launch and Activation Permissions” alanında Edit butonuna basılarak Internet Guest Account hesabı eklenir. Bu hesap “IUSR_makine ismi” formatında görünecektir. (Not : İstemci üzerinden gelen kullanıcı herzaman IUSR olmayabilir, NETWORK SERVICE, ASPNET, SYSTEM veya tanımlı başka bir kullanıcı sisteminizde bu konuda yetkilendirilmiş olabilir. Dolayısıyla yetkilendirme yapılacak kullanıcılar sistemlerde farklılık gösterebilir. Siz kendi sisteminizde bu konudaki yetkili kullanıcı için Lobjects’e yetki vermelisiniz.)
Yetkilendirme için ise Local ve Remote kutuları işaretlenmelidir..
o “Access Permissions” alanında da Edit butonuna basılarak aynı işlem tekrar edilirek Internet Guest Account hesabı burayada eklenir. Yetkilendirme için ise Local ve Remote yetkilerine burada da izin verilmesi gerekmektedir.
o “Configuration Permissions” alanında Edit butonuna basılarak Internet Guest Account hesabı eklenir. Bu hesap “IUSR_makine ismi” formatında görünecektir. Yetkilendirme için ise “Read” e izin verilmesi gerekmektedir.
- “Identity” tabında “This User” alanında kullanılan makinenin “Administrator” kullanıcısı girilmelidir. Buradaki amacımız Lobjects.exe’yi de kullanım yetkisine sahip klasörlere yazma-okuma yetkilerinde bir kullanıcıyı göstermektedir. (Not : Projenizde “impersonate = true” ise “The launcing user” seçeneğini seçip yetkilendirme işlemini Everyone için de yapabilirsiniz. )
2 – IIS – Application Pool Kullanıcsının Değiştirilmesi
DCOM Cnfg üzerinden yaptığımız yetkilendirmede bir sonuç elde edemediğimiz durumlarda bir diğer seçenek IIS kullanıcısını Logo Objects’e yetkili bir kullanıcı ile değiştirmemizdir.
Aşağıda projemizin DefaultAppPool altında olduğu varsayılarak yapılmış bir havuz kullanıcı değiştirme örneği bulunmaktadır. Siz farklı bir havuz kullanıyorsanız ona yetkilendirme yapmanız gerekir. Örnekte DB, Set ve IIS lokalde olduğu ve farklı clientlardan bağlantıya ihtiyaç olmadığı için sisteme bağlanılan domain kullanıcısı “LOGOMERKEZ\Nacio” kullanılmış. Fakat siz clientlarında ulaşabilmesi için internet üzerinden servera ulaşan kullanıcıyı örneğin IUSR_ kullanıcısını kullanabilirsiniz(tabi öncelikle yukarıda anlatılan Lobjects için IUSR kullanıcısına full yetki verme işlemlerini yapmalısınız)
Aşağıdaki ekran görüntüsü IIS 7 ye aittir, ancak IIS 6 veya farklı versiyonlarda ekranlar farklı olmasına rağmen aynı mantık uygulanabilmektedir.
3 – WebConfig dosyası içerisinde impersonate tanımı ile yetkilendirme
Yetkilendirme problemlerinin asıl sebebi ISS’a çağrı yapan kullanıcının Logo Objects EXE oluşturmakta sorun yaşamasıdır. Ancak, Guest User yerine Admin kullanıcı üzerinden çağrı yapılsaydı sorun yaşanmayabilir. Bu kimlik değiştirme olayını projemizde yapabiliyoruz.
DOT NET projelerindeki config dosyası içerisine <identity impersonate="true" userName="domain\user" password="password" /> ifadesini eklerseniz, DCOMCNF’den yetkilendirme yapmanıza gerek kalmaz. IIS ‘den gelen çağrıyı yapan kullanıcı kimlik değiştirerek verdiğiniz kullanıcıya dönüşüyor . Admin kullanıcı ve şifresi ile tanımlama yapıldığında ASPNET ve IUSR gibi kullanıcıların yetkilerine takılmadan nesneleri oluşturabiliyor.
impersonate kullanım şekillerini aşağıda bulabilirsiniz.
- Impersonation is disabled. .NET üzerindeki öndeğer ayar bu şekildedir. Ayar değiştirilmediğinde diğer yetkilendirme yöntemleri kullanılmalıdır
<identity impersonate="false" />
- Impersonation enabled. Bu şekilde tanımlama yapıldığında IIS internet kullanıcısına yetki verilmesi gerekmektedir. (IUSR_machinename).
<identity impersonate="true" />
- Impersonation enabled for a specific identity. Projenin yetki problemlerini aşmak için en kolay yöntem budur. Burada Admin kullanıcının belirtilmesi sistem üzerindeki birçok yetki problemine takılmamızı engelleyecektir.
<identity impersonate="true" userName="domain\user" password="password" />
Yetkilendirme probleminin tespiti
Yetkilendirme işlemi doğru yapılmadığında browserda şu hata gözükmektedir;
Retrieving the COM class factory for component with CLSID {72DB412A-6BF5-4920-A002-2AAC679951DF} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
Bu hatanın sebebini Event Viewer içerisinden de izleyebilirsiniz;
Event Viewer üzerinde LObjects.exe ye erişmesi gereken (erişmeye çalışan) kullanıcı (servis) göreceksiniz. Bu kullanıcı erişmeye çalıştığında çıkan hata ile detaylı bilgisi yer almaktadır.
Açıklamada bu kullanıcının (servisin) Local Activition yetkisine ihtiyaç duyduğu belirtilmiş. Bu durumda Lobjects.exe ye ait dcom objesinde bu kullanıcıya ihtiyaç duyduğu yetkiyi vermemiz gerekiyor. Local Activition yetkisine ihtiyaç duyduğu için Güvenlik (Security) sekmesinden bu dökümanda anlatıldığı şekilde Launch and Activition Permision içerisinden ihtiyaç duyulan kullanıcıya bu yetkilerin verilmesi gerekiyor.