Shell_exec IIS 6.0 üzerinde çalıştırmak için almak nasıl

6 Cevap php

The Problem

I shell_exec pdf-metin dönüştürücü çalıştırmak için kullandığı bir PHP komut dosyası var. I shell_exec sadece dir komutunun çıkışını echo için kullandığı kısa bir senaryo oluşturduk sorunu basitleştirmek için.

<?php
$cmd = 'C:\\WINDOWS\\system32\\cmd.exe /c ';
echo shell_exec($cmd.' dir');
?>

Ben Apache sunucu üzerinde bu çalıştırdığınızda beklendiği gibi, her şey çalışıyor. Ben IIS geçtiğinizde hat tamamen atlanır, sanki bu: hiçbir hata, hiçbir çıkış, hiçbir günlükleri, hiçbir şey.

Ben aktif dizinde karşı benim kullanıcıların kimliğini doğrulamak için gidiyorum, çünkü ne yazık ki, ben IIS kullanmanız gerekir.


Here's what I've tried so far:

  • Yerine doğrudan verilmesi daha cmd.exe /c ile komutunu verin
  • Üzerine SERVICE için Read & Execute izin ver "C: \ WINDOWS \ system32 \ cmd.exe"
  • Üzerine NETWORK SERVICE için Read & Execute izin ver "C: \ WINDOWS \ system32 \ cmd.exe"
  • Üzerine IUSR_MACHINENAME için Read & Execute izin ver "C: \ WINDOWS \ system32 \ cmd.exe"
  • Üzerine Everyone için Read & Execute izin ver "C: \ WINDOWS \ system32 \ cmd.exe" (haha, bu uzun süre böyle kalmak değil, merak etmeyin)
  • Run PHP as an ASAPI module
    • Bu benim standart yapılandırması
  • Run PHP as a CGI extention
    • This does not work, I get an error: CGI Error The specified CGI application misbehaved by not returning a complete set of HTTP headers.
  • IIS Yöneticisi'nde, web sitenizde Execute Permissions Scripts and Executables ayarlandığında
  • İşlenmiş alırsa görmek script html biçimlendirme ve diğer php fonksiyonlarını ekledi; öyle. shell_exec biraz sadece atlanır olur sanki.

Bu soruya bakmak için size çok teşekkür ederim, ben şimdi sorunu ile saçımı çekerek am

Cheers, Iain


Update 1

Ben gerçekten bunu yapmak istemedim, ama bir önlem olarak cURL aracılığıyla ben (shell_exec cezası çalıştığı) web sunucusu Apache koşuyorum uygun bir çözüm bulmak ve benim apache komut arayana kadar. Bu çirkin, ama o :) çalışıyor.


Update 2

Ben bu kadar çok gibi IIS veya izinleri ile ilgili bir sorun, ama belki bizim ağda bazı politikasının bir sonucu değildir düşünmeye başlıyorum - ne hayal değil. Herhangi bir fikir alanın sol?

6 Cevap

İşte bir kaç nokta var:

  • shell_exec fonksiyonu atlama PHP ile ilgili olarak, PHP güvenli modda çalışmadığından emin olun. PHP kılavuzundan - on shell_exe page:

Not: PHP güvenli modda çalışırken Bu fonksiyon devre dışı bırakılır.

Ayrıca bu Windows PHP kabuk komutları yürütme ile oldukça bilinen bir sorun olduğu görülmektedir. Uzlaşma işe almak için en iyi yolu (- dolayısıyla benim ikinci nokta ben zaten denedim ve işe almak söyledi biliyorum) FastCGI modunda PHP çalışan var olduğunu gibi görünüyor. Sen Microsoft IIS Forum thread yardımcı bu bulabilirsiniz.


  • Şimdi kadar Active Directory karşı kimlik doğrulaması için Windows üzerinde PHP çalıştırmak için sahip olarak - you don't have to!

Apache mod_auth_ldap üzerinden LDAP kimlik doğrulaması sağlar. Ve PHP aşağıdaki fonksiyonları ile LDAP desteği sağlar:

Active Directory LDAP bir uygulamasıdır. Yani, herhangi bir LDAP istemcisi ile Active Directory karşı kimlik doğrulaması gerçekleştirebilir.

P.S. Sen Apache mod_auth_ldap veya PHP LDAP işlevleri kullanabilirsiniz ya da - bu işi yapmak için ikisini aynı anda kullanmak gerekmez. PHP LDAP İşlevleri size kimlik doğrulama ve yetkilendirme işlemi üzerinde daha fazla kontrol sağlamak ise Apache mod_auth_ldap, HTTP protokolü düzeyinde çalışır.

notlar çift

doğrudan bir. exe çalıştırmak istiyorsanız, size $ seçenekler = array ('bypass_shell' => TRUE) ile () proc_open kullanabilirsiniz

sorun bu sınıfa kazma zaman da procmon.exe (sysinternals) en iyi arkadaşım

Aşağıda izni gerekiyor hangi kullanıcı belirlemek için daha sistematik bir yoldur

Eğer C aşağıdaki yürütülebilir olduğunu onaylayın: \ WINDOWS \ SYSTEM32 (ya da daha genel olarak% systemroot% \ system32)

cmd.exe  
whoami.exe  

Bu yürütülebilir için geçerli ACL edin

c:\windows\system32> cacls cmd.exe  
c:\windows\system32> cacls whoami.exe  

Kullanıcı "Herkes" Read (R) erişim izni ise aşağıdaki gibi, o GEÇİCİ hibe

c:\windows\system32> cacls cmd.exe /E /G everyone:R  
c:\windows\system32> cacls whoami.exe /E /G everyone:R  

Aşağıdaki içeriğe sahip whoami.php oluşturun

<?php  
$output = shell_exec("whoami");  
echo "<pre>$output</pre>";  
?>  

Bir web tarayıcısı üzerinde whoami.php yükleyin ve adınız görüntülenir örneğin not benim durumumda gösterdi

ct29296 \ iusr_template

Yukarıda adımda eklenecek olsaydı "Herkesin" izni iptal

c:\windows\system32> cacls cmd.exe /E /R everyone  
c:\windows\system32> cacls whoami.exe /E /R everyone  

Cmd.exeye Okuma + Yürütme izni (R) ile 5. adımda bulunan sadece adını vermek

c:\windows\system32> cacls cmd.exe /E /G ct29296\iusr_template:R  

Kendi sistemi için doğru kullanıcı adı kullanmayı unutmayın.

Bkz: http://www.myfaqbase.com/index.php?q=php+shell_exec&ul=0&show=f

(Aynen IUSR_MachineName değilse) ben IIS çalıştıran kullanıcı thats Read & Execute izni söyleyebilirim

Ben aktif dizinde karşı benim kullanıcıların kimliğini doğrulamak için gidiyorum, çünkü ne yazık ki, ben IIS kullanmanız gerekir.

IIS üzerinde uygulama dayandırarak için öncül kusurludur. Apache ile bunu durdurmak için bir şey yok. Gerçekten de, hatta bir MS-Windows işletim sistemi üzerinde çalıştırmak gerekmez.

Bu kadar kurmak için nasıl bir google var.

IIS ve yerel müşteriler potansiyel NTLM kullanarak, güvenlik politikası pencereden dışarı atılmış olur unutmayın. IIS işleyicisi parçacığı bir NTLM MSIE müşterinin kimlik bilgileri ile çalıştırabilirsiniz. Ya da değil. Bunları hata ayıklama seni deli edecek!

C.

I added the user NETWORK SERVICE with READ & EXECUTE, READ to the directories where the executables of my application resides. Since this alteration, the problem is gone. Nevertheless, it's also neccessary to grant the permissions READ & EXECUTE, READ for IUSR_ to cmd.exe.

Ben buradan aldım çözüm http://forums.iis.net/t/1147892.aspx