2009-12-10 25 views
6

मैं PsExec.exe को आमंत्रित करने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं जो मेरे कंसोल एप्लिकेशन को दो सर्वरों में आमंत्रित करता है, मैं आवंटित प्रक्रियाओं (मेरे कंसोल ऐप्स) की प्रक्रिया आईडी को पकड़ने में सक्षम नहीं हूं।सी # में PsExec.exe के लिए प्रक्रिया आईडी प्राप्त करने के लिए आवश्यक सहायता?

प्रक्रिया। मानकऑटपुट। ReadToEnd()); केवल मुझे servernames दे रहा है लेकिन पूरी सामग्री नहीं है।

क्या आप कृपया दूरस्थ सर्वर पर PsExec.exe द्वारा उत्पन्न प्रक्रिया आईडी प्राप्त करने में मेरी सहायता कर सकते हैं ??

 Process process = new Process(); 
     ProcessStartInfo psi = new ProcessStartInfo(@"PsExec.exe"); 
     psi.UseShellExecute = false; 
     psi.RedirectStandardOutput = true; 
     psi.RedirectStandardError = true; 
     psi.RedirectStandardInput = true; 
     psi.WindowStyle = ProcessWindowStyle.Minimized; 
     psi.CreateNoWindow = true; 
     psi.Arguments = @"-i -u Username -p xxxxxx \\server1,server2 C:\data\GridWorker\GridWorker.exe 100000"; 
     process.StartInfo = psi; 
     process.Start(); 

     Console.WriteLine(process.StandardOutput.ReadToEnd()); 

उत्तर

0

मुझे नहीं लगता कि आप PsExec को जिस तरह से चाहते हैं उसमें पिड वापस करने के लिए प्राप्त कर सकते हैं।

हालांकि, आप क्या कर सकते हैं अपने स्वयं के एप्लिकेशन स्टार्टर रैपर को कंसोल एप्लिकेशन के रूप में लिखते हैं, और यह पिड वापस कर देता है। इसके बाद आप PsExec को "एपस्टार्टर" कहकर एप्लिकेशन शुरू कर सकते हैं, इस प्रकार अपने पिड को वापस कर सकते हैं।

की तर्ज पर कुछ:

namespace AppStarter 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Process process = new Process(); 
      ProcessStartInfo psi = new ProcessStartInfo(args[0]); 
      psi.UseShellExecute = false; 
      psi.RedirectStandardOutput = true; 
      psi.RedirectStandardError = true; 
      psi.RedirectStandardInput = true; 
      psi.Arguments = string.Join(" ", args, 1, args.Length - 1); 
      process.StartInfo = psi; 
      process.Start(); 
      Console.WriteLine("Process started with PID {0}", process.Id); 
     } 
    } 
} 

[इस, आदि एक किसी न किसी और के लिए तैयार उदाहरण है कोई अपवाद हैंडलिंग के साथ, - बस एक उदाहरण के रूप में]

अब ऊपर आपका कोड somthing हो जाता है की तरह

Process process = new Process(); 
    ProcessStartInfo psi = new ProcessStartInfo(@"AppStarter.exe"); 
    psi.UseShellExecute = false; 
    psi.RedirectStandardOutput = true; 
    psi.RedirectStandardError = true; 
    psi.RedirectStandardInput = true; 
    psi.WindowStyle = ProcessWindowStyle.Minimized; 
    psi.CreateNoWindow = true; 
    psi.Arguments = @"PsExec.exe -i -u Username -p 26.06.08 \\server1,server2 C:\data\GridWorker\GridWorker.exe 100000"; 
    process.StartInfo = psi; 
    process.Start(); 

    Console.WriteLine(process.StandardOutput.ReadToEnd()); 
5

PsExec कमांडलाइन को -d पैरामीटर जोड़ने का प्रयास करें।

को समाप्त करने के लिए आवेदन की प्रतीक्षा न करें। केवल गैर-इंटरैक्टिव एप्लिकेशन के लिए इस विकल्प का उपयोग करें।

यह मानक आईडी को सही ढंग से प्रक्रिया आईडी वापस कर देना चाहिए।

उदाहरण:

ProcessStartInfo psi = new ProcessStartInfo(
    @"PsExec.exe", 
    @"-d -i -u user -p password \\server C:\WINDOWS\system32\mspaint.exe") 
          { 
           UseShellExecute = false, 
           RedirectStandardOutput = true, 
           RedirectStandardError = true, 
           RedirectStandardInput = true, 
           WindowStyle = ProcessWindowStyle.Minimized, 
           CreateNoWindow = true 
          }; 
Process process = Process.Start(psi); 

Console.WriteLine(process.StandardError.ReadToEnd()); 

आउटपुट:

PsExec v1.94 - Execute processes remotely 
Copyright (C) 2001-2008 Mark Russinovich 
Sysinternals - www.sysinternals.com 

C:\WINDOWS\system32\mspaint.exe started with process ID 5896. 
+0

क्षमा करें मैं अपने नमूने में -d param जोड़ने के लिए भूल गया। "यह मानक आईडी को सही ढंग से प्रक्रिया आईडी वापस कर देना चाहिए।" क्या आप कुछ नमूना दे सकते हैं? –

0

अब तक मैं मूल प्रश्न understodd, कार्य रिमोट मशीनों पर remoetely शुरू कर दिया प्रक्रियाओं की पीआईडी ​​प्राप्त करने के लिए किया गया था। क्या ये सच है? इस मामले में, कोई भी जवाब वास्तव में सहायक नहीं है।

प्रारंभिक प्रक्रियाओं को लाने के लिए आपको अपने प्रत्येक दूरस्थ कंप्यूटर के लिए WMI क्वेरीज़ बनाना होगा। यह "Win32_ProcessStartTrace" कक्षाओं का उपयोग करके किया जा सकता है।

यदि आपको और सहायता चाहिए, तो मुझे बताएं।

br - mabra

+0

'PsExec' ठीक ठीक होने के बाद रिमोट प्रोसेस आईडी लौटाता है। वह इसे सही स्ट्रीम (मानक मानक के मानक में मानक आउटपुट) से नहीं पढ़ रहा था। –