Asp.NET Websitesi Üzerinden Console Application Çalıştırmak ve Sonuç Okumak

Kendi serverımızda çalışması için yazdığım CMS uygulamasında CMS üzerinde eklenen her websitesi için IIS'e binding eklememiz gerekiyordu. Bu işlemi manuel yapmak zaman kaybı. Bende bu işi yapan bir konsol uygulaması yazdım ve websitesinden bu konsol uygulamasını çalıştıran ve programdan dönüş değerini okuyan bir method yazdım. Burda kodun tamamını vermeyeceğim ancak basitçe bu işlemi nasıl yapabileceğinizi anlatacağım.

Öncelikle yazının başında kendi serverımız diye başlamamın sebebi, bu tarz bir uygulamada büyük ihtimalle admin haklarına ihtiyacınız olacak. Eğer admin kullanıcı adı ve şifresine sahipseniz konsol uygulamasını nasıl impersonate edeceğinizi bir sonraki yazımda anlatacağım, şimdilik basit bir websitesi üzerinden basit bir konsol uygulaması çalıştıralım. Yazının sonunda uygulamanın örnek kodlarını indirebilirsiniz.

Websitesi üzerinde bu işlemi yapmak için tek ihtiyacımız olan şey aşağıdaki method.

///
/// Konsol uygulamasına parametre göndererek çalıştırır ve dönen değeri alır.
///
///Gönderilecek parametreler (virgül ile ayrılmış)
/// string
private static string ExecuteConsoleApp(string arguments)
{
    var process = new System.Diagnostics.Process();
    process.StartInfo.FileName = @"D:\Works\TestArea\ASPNETConsole\ConsoleApp\bin\Debug\ConsoleApp.exe"; // konsol uygulamasının tam yolu
    process.StartInfo.Arguments = arguments;
    process.StartInfo.RedirectStandardOutput = true; // standart output, bu sayede dönüş değerini okuyacağız
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true; // programın ekranda gözükmesini istemiyoruz
    process.Start();

    string retVal = process.StandardOutput.ReadToEnd().Trim();
    process.Close();
    return retVal;
}

Bu methodu bir butonun onclick olayına yazığımızı varsayalım.

protected void Button1_Click(object sender, EventArgs e)
{
    // Label1 adlı label kontrolümüze konsol uygulamasından dönen değeri yazacağız
    // konsol uygulamasına parametre olarak action1 gönderiyoruz, istersek hiçbişey göndermeyebiliriz
    Label1.Text = ExecuteConsoleApp("action1");
}

Örnek olarak kullanacağımız konsol uygulamasının Main methodu

static void Main(string[] args)
{
    // gelen parametreye göre başka işlemler yaptırabiliriz
    switch (args[0])
    {
        case "action1": Console.WriteLine("action 1 executed"); break; // parametre action1 ise ekrana action 1 executed yazalım
        case "action2": Console.WriteLine("action 2 executed"); break; // parametre action2 ise ekrana action 2 executed yazalım
    }
}

Konsol uygulamamıza parametre göndererek çalıştırdık ve dönüş değerini aldık. Benim yazmış olduğum bu basit uygulamayı geliştirip başka işler yapmasını sağlayabilirsiniz.

Programın kodlarına aşağıdan indirebilirsiniz.
ASPNETConsole.rar (21,22 kb)
Solution dosyası VS2010 ile hazırlanmıştır ve Framework 3.5 kullanılmıştır.

Güncelleme

(20.12.2011)

Yazıda bahsettiğim fakat sonradan paylaşmadığım, konsol uygulamasında admin haklarla işlem yapmak için gerekli kodu paylaşıyorum.

Konsol uygulamasının içerisinde, işlem yapmadan önce ImpersonateAdmin() methodunu çağırarak işlem yaparsak admin haklara sahip oluyoruz.

static void ImpersonateAdmin()
{
    string user = "admin_user";
    string userDomain = "admin_domain";
    string password = "admin_password";

    bool impersonate = true;
    IntPtr userHandle = new IntPtr(0);
    WindowsImpersonationContext impersonatedUser = null;

    if (impersonate)
    {
        bool returnValue = LogonUser(
            user,
            userDomain,
            password,
            LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT,
            ref userHandle
            );

        if (!returnValue)
        {
            throw new Exception("Invalid Username");
        }

        WindowsIdentity newId = new WindowsIdentity(userHandle);
        impersonatedUser = newId.Impersonate();
    }
}

//
// Bu bölüm impersonation için gerekli
//
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_LOGON_SERVICE = 3;
public const int LOGON32_PROVIDER_DEFAULT = 0;

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern bool LogonUser(
    String lpszUserName,
    String lpszDomain,
    String lpszPassword,
    int dwLogonType,
    int dwLogonProvider,
    ref IntPtr phToken
);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);

Yorumlar (8) -

kadir
kadir
18.12.2011 06:08:12 #

slmlar yazının üzerinden baya bi süre geçmiş ama bu şekilde bi ihtiyacım oldu ve ikitane sorunum var birincisi localde deniyorum access  is denied diyo dediğiniz gibi yetki işlemlerinden heralde bunu nasıl aşabilirim çünkü localde görmem lazım biraz uzun bi proje ikinci sorunumda projeyi web servera yükledim diyelim yolunu nasıl göstermem gerekir ?teşkkr ederim

arunes
arunes
20.12.2011 13:36:38 #

Selamlar, yazıyı güncelledim ve admin haklarla işlem yapmak için gerekli kodu ekledim. İkinci soruna gelince konsol uygulamasının tam yolunu bulmalısın. Asp.net ile kodun çalıştığı sayfanın ana klasörünü <%=Server.MapPath("~")%> ile bulabilirsin. Yakın klasörlerde bulunuyorlarsa, bulduğun yol sana yardımcı olabilir.

Birol
Birol
22.01.2012 19:21:47 #

Şuan üzerinde durduğum bir konu. ellerinize sağlık çok güzel hazırlamışsınız.
Benim bir sorum olacaktı burada ben ImpersonateAdmin metodunu process.start demede once mi çağırmalıyım. Örnek uygulamada da göremedim ImpersonateAdmin metodunu çünkü.
Saygılarımla.

Birol
Birol
22.01.2012 19:31:17 #

Merhaba evet Start.Process demeden once çağırıyorum metodu. Teşekürler.

Birol
Birol
22.01.2012 19:47:57 #

Merhaba Hocam ImpersonateAdmin() olarak bir kullanıcı veriyorum yetkili. Fakat gene exeyi açarken access denied. alıyorum. Bir kaç kullanıcı denedim olmadı . Task managerda  Network Service olarak görüyor bu arada.
İyi çalışmalar.

arunes
arunes
23.01.2012 08:34:37 #

ImpersonateAdmin metodunu, hak gerektiren işlemleri yapmadan önce çağırmak gerekli. Benim denediğim örnekte sorun çıkmamıştı. Deneme yaptığın kodları paylaşırsan, bi ara bakarım.

Birol
Birol
23.01.2012 10:40:13 #

Merhaba Çalıştırma Kodları aşşağıda .

ImpersonateAdmin();

ProcessStartInfo startInfo = new ProcessStartInfo(AbbyyPath);

startInfo.Arguments =" " + infile + " conversion";


startInfo.UseShellExecute =false;

var proc = Process.Start(startInfo);

Saygılarımla.

Muhammet
Muhammet
11.02.2012 16:32:41 #

Merhabalar, Öncelikle anlatim icin tesekkür ederim ancak benim bir sorum var:
gerekli kodlamalari yaptim ancak hem server uzerinde hemde client üzerinde programi calistiramadim daha acik anlatmam gerekirse Bir client makinede Microsoft Visual Web Developer la kodlamalari yapip derleyip calistirdigimda Kodlama mükemmel calisiyor, ancak derlenmis dosyalari Windows Server 2003 e atiyorum IIS üzerinde hem server da hemde client makinede calismiyor..
kodlarin sorunsuz sekilde calismasi icin acaba nasil bir düzenleme yada iis üzerinde nasil bir ayar yapmam gerekli ?

Yorum ekle

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading

I'm blogging in English too. To visit my English blog click here.

Ali Rıza Üneş Hakkında

Amatör olarak 1998, profesyonel olarak 2001 yılından bugüne kadar web sitesi tasarımı ve programlama üzerine çalışmıştır. 2008 yılında Microsoft .NET teknolojileri üzerine eğitim almış, ASP.NET, C# ile yazılımlar/web siteleri ve Microsoft Dynamics CRM üzerine özel uygulamalar geliştirmektedir.

Profilin tamamını görüntüle

Sayfalar

Stackoverflow

Arşiv

Son Yorumlar

Comment RSS

• Microsoft Dynamics™ CRM 4.0 Installation and Deployment
• Microsoft Dynamics™ CRM 4.0 Customization and Configuration
• Microsoft Dynamics™ CRM 4.0 Applications