C# ile IIS7’den Site ve Uygulama Bilgilerini Çekmek

IIS7 IIS7   .NET ortamından IIS’i yönetmenin birden fazla yolu vardır. Bunlardan bir tanesi (ve en yenisi) hazır bir kütüphane olan Microsoft.Web.Administration’ı kullanmaktır.

Bu kütüphane, sisteminize IIS7 veya yedi buçuk yüklediğiniz zaman otomatik olarak yüklenmektedir. Aşağıdaki adresten bulunarak, referans olarak projenize eklenmektedir:

%WinDir%\System32\InetSrv\Microsoft.Web.Administration.dll

Kapsam

Microsoft.Web.Administration ile sadece IIS7 ve IIS 7.5’i yönetebilirsiniz. Önceki sürümler için başka yöntemler araştırmalısınız. Bu yazıda onlara değinilmeyecektir. Anlatımda Visual Studio 2010 ve .NET 4 kullanılacaktır.

Microsoft.Web.Administration Kütüphanesini Projenize Ekleyin

Microsoft.Web.Administration-referans Microsoft.Web.Administration-referans   İlk iş kullanacağınız kütüphaneyi referanslar kısmından projenize eklemek. Bu kütüphaneyi IIS’in yüklü olduğu klasörde (%WinDir%\System32\InetSrv) Microsoft.Web.Administration.dll ismiyle bulabilirsiniz. Eğer böyle bir klasör bulamıyorsanız, sisteminizde IIS yoktur. IIS yükleyiniz.

Bir başka alternatif de bu dosyayı internetten bulup indirmektir. Ama IIS olmadan kütüphaneyi bulup indirmenizin çok da bir anlamı olmayacağından ilk seçenek daha mantıklıdır.

Kulanın!

Kütüphaneyi sisteminize ekledikten sonra bilgileri çekmek çok kolay! Aşağıdaki kod örneğinde IIS sitelerini, sitelerdeki uygulamaları ve bu uygulamalar/siteler ile ilgili çeşitli bilgileri konsola yazdırıyoruz. Gerekenleri seçim kullanmak size kalmış. [csharp] public void IISSiteVeUygulamaBilgileriniYazdir() { try { ServerManager sm = new ServerManager(); foreach (Site site in sm.Sites) { /* Tüm IIS Sitelerini tek tek geziyoruz */

Console.WriteLine("Site ID: " + site.Id); Console.WriteLine("Site Name: " + site.Name); Console.WriteLine("Status: " + site.State.ToString());

Microsoft.Web.Administration.Application applicationRoot = site.Applications.Where(a => a.Path == "/").Single(); VirtualDirectory virtualRoot = applicationRoot.VirtualDirectories.Where(v => v.Path == "/").Single();

Console.WriteLine("Root Path: " + virtualRoot.PhysicalPath);

/* Aşağıdaki kısım alıntıdır: http://msdn.microsoft.com/en-us/library/microsoft.web.administration.binding(v=vs.90).aspx#Y311 */ string bindingdisplay = null; foreach (Microsoft.Web.Administration.Binding binding in site.Bindings) { bindingdisplay = bindingdisplay + "BindingInformation: " + binding.BindingInformation; if (binding.Protocol == "https") { // There is a CertificateHash and // CertificateStoreName for the https protocol only. bindingdisplay = bindingdisplay + " CertificateHash: " + binding.CertificateHash + ": "; // Display the hash. foreach (System.Byte certhashbyte in binding.CertificateHash) { bindingdisplay = bindingdisplay + certhashbyte.ToString() + " "; } bindingdisplay = bindingdisplay + " CertificateStoreName: " + binding.CertificateStoreName; } bindingdisplay = bindingdisplay + " EndPoint: " + binding.EndPoint; bindingdisplay = bindingdisplay + " Host: " + binding.Host; bindingdisplay = bindingdisplay + " IsIPPortHostBinding: " + binding.IsIPPortHostBinding; bindingdisplay = bindingdisplay + " Protocol: " + binding.Protocol; bindingdisplay = bindingdisplay + " UseDsMapper: " + binding.UseDsMapper + "\n\n"; }

Console.WriteLine("Binding: " + bindingdisplay); /* Alıntı Sonu */

foreach (Microsoft.Web.Administration.Application app in site.Applications) { /* Bir sitenin içindeki tüm uygulamaları tek tek geziyoruz */

Console.WriteLine("AppPath: " + app.Path); Console.WriteLine("ApplicationPoolName: " + app.ApplicationPoolName); Console.WriteLine("EnabledProtocols: " + app.EnabledProtocols);

string virtualDirectory = null; foreach (Microsoft.Web.Administration.VirtualDirectory virtua in app.VirtualDirectories) { virtualDirectory += virtua.Path + " (" + virtua.PhysicalPath + ") ; "; } Console.WriteLine("VirtualDirectories: " + virtualDirectory); } } } catch (Exception e) { Console.Write("IIS ile ilgili bir sıkıntı var: " + e.Message + " " + e.StackTrace); } Console.Read(); } [/csharp]

Karşılaşılabilecek Olası Hatalar

Yetki Hatası

Uygulamayı yönetici olarak açın. Geliştirme esnasında da Visual Studio’yu yönetici olarak açın. IIS bilgilerinin okunması için sistem bu yetkilere ihtiyaç duyar.

IIS Yok

Eğer IIS yüklü değilken bu kodu çalıştırırsanız upuzuuuun bir exception fırlatılacaktır.

Program Derlenmiyor

The type or namespace name 'Web' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?)

The referenced assembly "Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" could not be resolved because it has a dependency on "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which is not in the currently targeted framework ".NETFramework,Version=v4.0,Profile=Client". Please remove references to assemblies not in the targeted framework or consider retargeting your project.

Bunlara benzer hata alıyorsunuz. Bu, .NET Framework 4 yerine .NET Framework 4 Client Profile kullanmanızdan dolayı kaynaklanıyor. .NET Framework 4 Client profile, .NET Framework’ün sadece bazı özelliklerini barındıran bir alt kümesidir. Kullandığınız Framework’ü değiştirirseniz sorun çözülür.

framework-secimi framework-secimi