2013-04-30 20 views
8

Sto cercando di eseguire PSExec dall'applicazione Web Asp.Net per connettersi a un server remoto. In qualche modo dà "Access Denied Error -5" senza le credenziali impostate e impostando le credenziali nel comando PSEXEC dà "2250 Network connection could not be found". Sono un amministratore sul server e ho Windows authentication and Asp.Net Impersonation abilitato (IIS7.5). Più interessante quando provo a eseguire questo da un console application o anche solo usando il command prompt funziona perfettamente. Sto provando a fare solo un'operazione di ping come test.Esegui script utilizzando sysinternals PSExec dall'applicazione Web Asp.Net

Ecco il mio frammento di codice: -

  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 

Qui: -

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 

Lo stesso comando e il codice funziona con un'applicazione console. COSÌ credo che sia sicuramente qualcosa a che fare con l'applicazione Asp.net che non è in grado di trasferire le credenziali al telecomando della macchina. Ho provato l'evento startInfo.LoadUserProfile ma senza risultati.

Apprezzo il tuo aiuto. Ho cercato di cercare domande simili ma non ho trovato una soluzione per il problema che sto affrontando.

+0

1 Se funziona con la console e non con l'applicazione Web asp, questo sembra un problema di sicurezza. 2 Hai anche verificato se la versione .net è quella giusta? Prova a eseguire il pool di app su IIS con .net 2.0 (ho avuto questo problema oggi). – gartenabfall

+0

Sto usando dotnet versione 4.0. Sì, sembra che più di un token di autenticazione non venga portato avanti ... – PSL

+0

IIS sta eseguendo gli stessi privilegi dell'utente del prompt dei comandi? – Powerslave

risposta

2

Prendere in considerazione l'uscita dal processo psexec. Andando a WMI direttamente può dare un quadro più chiaro ciò che sta andando male:

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

Se ancora esegue in problemi con la rappresentazione, può essere utile per scaricare i contenuti di HttpContext.Current.User.Identity per verificare IIS è configurato correttamente. Inoltre, se si utilizza Kerberos (tramite Negotiate/SPNEGO), potrebbe essere necessario allow the machine to delegate identity. Se si conosce l'SPN a cui si connetterà la macchina, è possibile utilizzare la delega vincolata, ma in molti casi è necessario consentire la delega non vincolata se gli obiettivi non sono noti in anticipo.


Nota: se si sta Remoting al computer solo per eseguire ipconfig, è possibile ottenere le stesse informazioni tramite WMI, senza dover pasticciare con il tentativo di ottenere il STDOUT uscita al computer chiamante. Dai un'occhiata alla classe Win32_NetworkAdapterConfiguration.