2013-04-30 15 views
8

Próbuję wykonać PSExec z mojej aplikacji sieci Web Asp.Net, aby połączyć się ze zdalnym serwerem. W jakiś sposób daje on "Access Denied Error -5" bez ustawionych referencji, a ustawiając poświadczenia w komendzie PSEXEC, daje to "2250 Network connection could not be found". Jestem administratorem na serwerze i mam włączoną Windows authentication and Asp.Net Impersonation(). Co ciekawsze, gdy próbuję wykonać to z poziomu console application lub nawet po prostu używając command prompt to po prostu działa dobrze. Próbuję wykonać operację ping jako test.Wykonaj skrypt przy użyciu sysinternals PSExec z aplikacji WWW Asp.Net

Tu jest mój urywek kodu: -

  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 

Tutaj: -

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 

To samo polecenie i kod działa z aplikacji konsoli. Sądzę, że zdecydowanie ma to coś wspólnego z aplikacją Asp.net, która nie jest w stanie przenieść referencji do zdalnego komputera. Wydarzenie próbowałem startInfo.LoadUserProfile, ale bezskutecznie.

Doceń swoją pomoc. Próbowałem znaleźć podobne pytania, ale nie mogłem znaleźć rozwiązania problemu, z którym się borykam.

+0

1 Jeśli działa z konsolą, a nie z aplikacją internetową ASP, to brzmi jak problem bezpieczeństwa. 2 Czy sprawdziłeś również, czy wersja .net jest właściwa? Spróbuj uruchomić pulę aplikacji w IIS z .net 2.0 (miałem dzisiaj ten problem). – gartenabfall

+0

Używam wersji dotnet 4.0. tak wydaje się, że więcej tokenu uwierzytelniania nie jest przenoszone .... – PSL

+0

Czy usługi IIS działają na tych samych prawach użytkownika, co w wierszu polecenia? – Powerslave

Odpowiedz

2

Należy rozważyć usunięcie z procesu psexec. Idąc do WMI bezpośrednio mogą dać lepszy wgląd w to, co się dzieje źle:

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"); 
} 

Jeśli nadal napotkasz problemy z personifikacji, pomocne może okazać się zrzucić zawartość HttpContext.Current.User.Identity aby zweryfikować IIS jest poprawnie skonfigurowany. Ponadto, jeśli używasz protokołu Kerberos (poprzez Negotiate/SPNEGO), może być konieczne uzyskanie allow the machine to delegate identity. Jeśli znasz SPN, z którym maszyna będzie się łączyć, możesz użyć ograniczonej delegacji, ale w wielu przypadkach konieczne jest zezwolenie na nieograniczoną delegację, jeśli cele nie są znane z wyprzedzeniem.


Uwaga: jeśli remoting do komputera wystarczy uruchomić ipconfig można uzyskać tę samą informację poprzez WMI bez bałaganu z próbuje wyjście STDOUT powrotem do komputera wywołującego. Spójrz na klasę Win32_NetworkAdapterConfiguration.

Powiązane problemy