2013-04-30 20 views
8

Bir uzak sunucuya bağlanmak için Asp.Net Web uygulamasından PSExec dosyasını çalıştırmaya çalışıyorum. Bir şekilde, hiçbir kimlik bilgisi olmadan "Access Denied Error -5" verir ve PSEXEC komutunda kimlik bilgilerini ayarlayarak "2250 Network connection could not be found" verir. Sunucuda bir yöneticiyim ve Windows authentication and Asp.Net Impersonation etkin (IIS7.5) var. Daha ilginç bir şekilde bunu bir console application ya da sadece command prompt kullanarak çalıştırmaya çalıştığınızda, sadece iyi çalışıyor. Test olarak sadece bir ping işlemi yapmaya çalışıyorum. İşteAsp.Net Web uygulamasından sysinternals PSExec komut dosyasını kullanarak çalıştırınız.

  var startInfo = new ProcessStartInfo{ 
       CreateNoWindow = true, 
       UseShellExecute = false, 
       FileName = FilePath, 
       Arguments = CommandArgs 
      } 

      Process vsCommandProcess = Process.Start(startInfo); 

      vsCommandProcess.WaitForExit(); 
      var exitCode = vsCommandProcess.ExitCode; 
      if (vsCommandProcess.ExitCode != 0) 
      { 
       ...rest of the code 

: - -:

FilePath --> C:\pstools\psexec.exe 
Arguments --> \\servername -accepteula -u domain\userName -p password ipconfig (1) 
       \\servername -accepteula ipconfig (2)   

(1) Gives Error 2250 (2) gives Error 5 

aynı komut ve kod bir konsol uygulaması ile çalışır

İşte benim kod parçacığı olduğunu. Bu yüzden kesinlikle makineye uzaktan kimlik bilgilerini taşımak mümkün olmayan Asp.net uygulaması ile bir şey olduğuna inanıyorum. Ben olay startInfo.LoadUserProfile çalıştı ama boşuna.

Yardımlarınız için teşekkür ederiz. Benzer sorulara bakmaya çalıştım ama karşılaştığım sorun için bir çözüm bulamadım.

+0

1 Konsolda çalışıyor ve asp web uygulamasıyla çalışmıyorsa bu bir güvenlik sorunu gibi görünüyor. 2 .net versiyonunun doğru olup olmadığını kontrol ettiniz mi? Uygulama havuzunuzu .net 2.0 ile IIS'de çalıştırmayı deneyin (Bugün bu sorunu yaşadım). – gartenabfall

+0

Dotnet sürüm 4.0 kullanıyorum. Evet, daha fazla kimlik doğrulama belirteci gibi taşınmıyor gibi görünüyor .... – PSL

+0

IIS, komut isteminizle aynı kullanıcı ayrıcalıkları altında çalışıyor mu? – Powerslave

cevap

2

psexec işlemden çıkmayı göz önünde bulundurun. WMI gidiş doğrudan yanlış neler olduğunu daha fazla açıklayıcı bilgi verebilir: Hala bürünme ile ilgili sorunlar yaşarsanız

var connOpts = new ConnectionOptions() 
{ 
// Optional, default is to use current identity 
    Username = "username", 
    Password = "password" 
}; 

// create a handle to the Win32_Process object on the remote computer 
ManagementScope mgmtScope = new ManagementScope(@"\\servername\root\cimv2", connOpts); 
ManagementClass w32Process = new ManagementClass(mgmtScope, 
    new ManagementPath("Win32_Process"), new ObjectGetOptions()); 

// create the process itself 
object[] createArgs = new object[] { 
    // [in] string CommandLine, 
    "notepad.exe", 
    // [in] string CurrentDirectory, 
    null, 
    // [in] Win32_ProcessStartup ProcessStartupInformation, 
    null, 
    // [out] uint32 ProcessId 
    0}; 

var result = (int)w32Process.InvokeMethod("Create", createArgs); 

switch (result) 
{ 
    case 0: /* no-op, successful start */ break; 
    case 2: throw new Exception("Access Denied"); 
    case 3: throw new Exception("Insufficient Privilege"); 
    case 8: throw new Exception("Unknown failure"); 
    case 9: throw new Exception("Path not found"); 
    case 21: throw new InvalidOperationException("Invalid Parameter"); 
} 

, IIS doğru yapılandırılmış doğrulamak için HttpContext.Current.User.Identity içeriğini dökümü yararlı olabilir. Ayrıca, Kerberos (Negotiate/SPNEGO aracılığıyla) kullanıyorsanız, allow the machine to delegate identity'a ihtiyacınız olabilir. Makinenin bağlanacağı SPN'yi biliyorsanız, kısıtlı yetkilendirmeyi kullanabilirsiniz, ancak çoğu durumda hedeflerin önceden bilinmemesi durumunda kısıtlanmamış yetkilendirmeye izin verilmesi gerekir.


Not: Bilgisayara Remoting eğer sadece ipconfig çalıştırmak için, geri çağıran bilgisayara STDOUT çıktı almaya çalışırken ile uğraşmak zorunda kalmadan WMI aracılığıyla aynı bilgileri alabilirsiniz. Win32_NetworkAdapterConfiguration sınıfına bir göz atın.

İlgili konular