evcil.net noktanın egemenliği

1104 / 080

Uzaktaki GAC’ı Kurcalamak

Bugünkü makalemiz, GAC üzerine. Nâm-ı diğer "Global Assembly Cache". Âşina olmayanlar için ufak bir girizgâhımız (iştah açıcı) olacak.

GAC Nedir?

.NET'in çıkış noktasını hatırlayınız. Windows'un birincil bileşen yapısına deva olarak ilan edildiği günleri hatırlayınız. O günlerde artık uygulamaların Registry'ye ihtiyaç duymadığı, XCOPY ile kopyalanarak eşeysiz üreyebildiği ve ürediği her yerde de kendi başına çalışabildiği söylenmişti. .NET hayatımıza, kendi bilgisini (metadata) üzerinde taşıyan "assembly"leri kazandırmıştı. Bir assembly, kendini tarif etmek için başka bir varlığa ihtiyaç duymuyordu. Versiyonu, kültürü, benzersiz anahtarı üzerindeydi. Assembly'ler bu özelliklerinden dolayı, birbirine karışmadan çalışabiliyordu. Herkesin kullanacağı ortak assembly'leri birbirine karışmadan atacağımız yer ise tam orasıydı işte: GAC.

GAC, ortak assembly'leri bulunduran özel bir klasör yapısı. %SYSTEMROOT\%assembly deyincesi çıkan dümdüz liste biraz kandırıyor bizi. Arka planda daha karmaşık bir dizinleme yapısı var ve atılan her assembly'yi ayrıntılı olarak depoluyor.

GAC Nasıl Yönetilir?

GAC,

  • .NET 1.1 ve .NET 2.0 için ayrı ayrı sunulan yapılandırma snap-in'leriyle:
    gac1
  • Gacutil.exe isimli ufak bir konsol programcığıyla:
    gac2
  • Windows Explorer'da assembly klasörü üzerine giydirilmiş "shell extension" aracılığıyla:
    gac3

yönetilebilir.

GAC'ı yönetmekten kasdımız, içine yeni assembly'ler atıp, mevcutları silebilmek vs.dir.

Bu alternatiflerden ilk ikisi Microsoft SDK'larıyla bilgisayarımıza yüklendiği için üretim ortamı bir makinede yokluğu hissedilecek şeylerdir. O durumda başvuracağımız çözüm sonuncu maddeki Windows Explorer olacaktır.

Hepsinden önemlisi bu saydığımız maddelerin hepsi yerel makinedeki GAC'ın yönetimini sağlıyor. Bir makinenin GAC'ını kurcalayacaksak ve illaki bu aletleri kullanacaksak mecburen makineye giriş yapıp üzerindeki bu araçları çalıştırmamız gerekiyor.

İşte mesele de bu. Neden uzaktaki makinenin GAC'ına müdahale edemiyoruz?

"Deployment" Öyküleri

Genelde uzaktaki bir sistem üzerine assembly'lerimizin dağıtımını yapıyorsak ve bu sistemin de GAC'ını kullanmak istiyorsak az önce "mesele" dediğimiz noktaya gelmişiz demektir. Elimizdeki assembly'leri şu uzaktaki makinenin GAC'ına nasıl atacağızdır? Hep gidip RDP ile masaüstüne bağlanıp el ile gacutil mi çalıştıracağızdır? Ya da sürükle bırak ile C:WindowsAssembly'ye dosya mı atacağızdır?

Microsoft buna bir şey yapması lazım değil midir?

Eğer meseleyle ilgili bir "arama motoru" tecrübesi yaşarsanız, size MSI yapmayı tavsiye olunur. İşiniz gücünüz yok, her çıkacağınız assembly için kütür kütür MSI yapacaksınız dostlar. Bu çözüm sizi tatmin ediyorsa yazının devamını boşverin.

Ya Remote Gacutil?

Yok böyle bir şey. Olmalı ama yok.

Ancak biraz kafa yorunca, uzaktaki makinede komut çalıştırma konseptinden gacutil'i tetikleyebileceğimizi buluruz. Bunun için piyasaya doğru bir salınım yaptığımızda en adam akıllı aracın harikalar diyarı SysInternals'ın PsExec'i olduğunu idrak ediyoruz.

Uzakları Yakın Eyleyen Program: PsExec

PsExec ile yeterli haklara sahip olduğunuz bir makine üzerinde komut işletebiliyorsunuz. Bu aleti kullanarak, karşı makinenin üzerinde gacutil'i tetikleyip assembly listesini düzenleyebiliriz ve güncelleyebiliriz demektir. Tam olarak bir Remote Gacutil yazmayı başaramasak da ona yaklaşabiliyoruz. Ne mutlu!

gac4

Gerisi kodlamayı seven programcılara kalmış. Yazsınlar kendi GAC-deployer araçlarını ve oturdukları yerden keyifle "deployment" yapsınlar. Microsoft, eminim zaman içerisinde MSI'dan daha makul çözümler de sunacaktır. O sunana kadar bizim yan yolumuz (workaround) da bu olsun.

Hadi bakalım. GAC ile.

Yazan: Muhammed C. Tahiroğlu

No description. Please complete your profile.
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


No trackbacks yet.

Sayfalar

Kısımlar

Desteklediklerimiz

Ay bazında arşiv

Haberleşme