2009-07-14 6 views
5

हमें एक Winforms LOB एप्लिकेशन मिला है, जो सामान्य परिस्थितियों को शुरू करने से पहले सामान्य परिस्थितियों की जांच करना चाहिए और किसी भी अद्यतन घटकों को डाउनलोड करना चाहिए।मुझे कैसे पता चलेगा कि मेरी प्रक्रिया कैसे शुरू हुई थी

एक समस्या जो हम देख रहे हैं वह यह है कि कर्मचारियों के कुछ सदस्यों ने इसे अद्यतन एप्लिकेशन नहीं चलाकर तेज़ी से लोड किया है, हालांकि इससे लोगों को नवीनतम सुविधाएं नहीं मिल सकती हैं और सभी प्रकार के सिरदर्द का समर्थन करने का कारण बनता है।

मैं क्या करने में सक्षम होना चाहता हूं अगर वे प्रारंभिक आवेदन के माध्यम से नहीं गए हैं तो चेतावनी फेंकना है। आदर्श रूप से, मैं अपडेट एप्लिकेशन को बदलने के बिना ऐसा करने में सक्षम होना चाहता हूं (जैसा कि इसका मतलब है कि प्रत्येक क्लाइंट पर एक नया एमएसआई जा रहा है और स्थापित करना), और जिस दृष्टिकोण से बाहर निकलना है, वह जानकारी ढूंढने का कोई तरीका ढूंढना है प्रक्रिया जिसने "मुझे" शुरू किया और एक सफेद/काली सूची के खिलाफ जांच की, हमेशा के लिए मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है?


एक तरफ : बेशक, अगर मैं अद्यतन आवेदन को बदलने का सहारा था, शायद मैं इसे बदलने के लिए या तो एक कमांड लाइन तर्क के रूप में एक पूर्व-साझा गुप्त पारित करने के लिए चाहते हैं, या बेहतर अभी भी, बदल आवेदन जैसे कि मैं इसे कक्षा पुस्तकालय के रूप में लोड कर सकता हूं और प्रासंगिक वर्ग को प्रतिबिंब के माध्यम से तुरंत चालू कर सकता हूं। क्लिकऑन को अस्वीकार कर दिया गया है क्योंकि does not support being installed for multiple users

उत्तर

4

यहाँ देखें: लिंक से How to get parent process in .NET in managed way

:

using System.Diagnostics; 
PerformanceCounter pc = new PerformanceCounter("Process", 
"Creating Process ID", Process.GetCurrentProcess().ProcessName); 
return Process.GetProcessById((int)pc.NextValue()); 

[संपादित करें: इसके अलावा इस बारे में कुछ और जानकारी के लिए System.Diagnostics FAQ देखते हैं। लिंक के लिए जस्टिन के लिए धन्यवाद।]

+1

सिस्टम से लिंक। डायग्नोस्टिक्स एफएक्यू http://msdn.microsoft.com/en-us/netframework/aa569609.aspx#Question3 – Justin

+0

अच्छा लिंक। शामिल करने के लिए संपादित करेंगे। –

+0

पूरी तरह से काम करता है, भले ही घोड़े के बोल्ट के बाद गेट बंद करने का मामला हो ... –

0

आप पेरेंट प्रक्रिया को खोजने के लिए कर्नल 32 विधि के साथ PInvoke का उपयोग कर सकते हैं और यह देखने के लिए जांच सकते हैं कि यह आपके अपडेटर से मेल खाता है या नहीं। Source. संहिता, मामले में यह गायब हो जाता है:

using System; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
static class myProcessEx 
{ 
    //inner enum used only internally 
    [Flags] 
    private enum SnapshotFlags : uint 
    { 
    HeapList = 0x00000001, 
    Process = 0x00000002, 
    Thread = 0x00000004, 
    Module = 0x00000008, 
    Module32 = 0x00000010, 
    Inherit = 0x80000000, 
    All = 0x0000001F 
    } 
    //inner struct used only internally 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    private struct PROCESSENTRY32 
    { 
    const int MAX_PATH = 260; 
    internal UInt32 dwSize; 
    internal UInt32 cntUsage; 
    internal UInt32 th32ProcessID; 
    internal IntPtr th32DefaultHeapID; 
    internal UInt32 th32ModuleID; 
    internal UInt32 cntThreads; 
    internal UInt32 th32ParentProcessID; 
    internal Int32 pcPriClassBase; 
    internal UInt32 dwFlags; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] 
    internal string szExeFile; 
    } 

    [DllImport("kernel32", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
    static extern IntPtr CreateToolhelp32Snapshot([In]UInt32 dwFlags, [In]UInt32 th32ProcessID); 

    [DllImport("kernel32", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
    static extern bool Process32First([In]IntPtr hSnapshot, ref PROCESSENTRY32 lppe); 

    [DllImport("kernel32", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
    static extern bool Process32Next([In]IntPtr hSnapshot, ref PROCESSENTRY32 lppe); 

    // get the parent process given a pid 
    public static Process GetParentProcess(int pid) 
    { 

    Process parentProc = null; 
    try 
    { 
     PROCESSENTRY32 procEntry = new PROCESSENTRY32(); 
     procEntry.dwSize = (UInt32)Marshal.SizeOf(typeof(PROCESSENTRY32)); 
     IntPtr handleToSnapshot = CreateToolhelp32Snapshot((uint)SnapshotFlags.Process, 0); 
     if (Process32First(handleToSnapshot, ref procEntry)) 
     { 
     do 
     { 
      if (pid == procEntry.th32ProcessID) 
      { 
      parentProc = Process.GetProcessById((int)procEntry.th32ParentProcessID); 
      break; 

      } 
     } while (Process32Next(handleToSnapshot, ref procEntry)); 
     } 
     else 
     { 
     throw new ApplicationException(string.Format("Failed with win32 error code {0}", Marshal.GetLastWin32Error())); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("Can't get the process.", ex); 
    } 
    return parentProc; 
    } 

    // get the specific parent process 
    public static Process CurrentParentProcess 
    { 
    get 
    { 
     return GetParentProcess(Process.GetCurrentProcess().Id); 
    } 
    } 

    static void Main() 
    { 
    Process pr = CurrentParentProcess; 

    Console.WriteLine("Parent Proc. ID: {0}, Parent Proc. name: {1}", pr.Id, pr.ProcessName); 
    } 
} 
3

मुझे लगता है अपनी प्रक्रिया है - जो मुझे लगता है कि आप पर नियंत्रण है - की जाँच करता है उसकी संस्करण संख्या बनाम नवीनतम जारी की संस्करण संख्या (रखा कहीं केंद्रीय db/एफ़टीपी जहाँ भी यू देखो अद्यतन के लिए), तो आपके पास एक ही स्थान पर वह तर्क है। मुझे लगता है कि यह एक आसान समाधान होगा।

+0

रिकॉर्ड के लिए, हमारे पास निदान स्क्रीन है कि समर्थन कर्मचारी बड़ी गंदे लाली में उस हाइलाइट को खींच सकते हैं यदि कुछ भी पुराना माना जाता है।मैं समय से पहले अपराधियों को पकड़ना चाहता था :) –

0

सबसे पहले, यदि आपके कर्मचारियों के पास यह समझने के लिए पर्याप्त स्मार्ट है कि लॉन्चर धीमा है और इसके आसपास कैसे जाना है, तो मुझे लगता है कि उन्हें कुछ 'गुप्त' कमांड लाइन स्विच मिलेगा, भी। मैं उस समय पर बर्बाद होने पर विचार करता हूं।

दूसरा, मुझे लगता है कि answer form Chris Marasti-Georg कठोर दिशा में जाता है: आपको मूल प्रक्रिया का नाम पता होना चाहिए, यानी आपके ऐप को लॉन्च करने वाली प्रक्रिया। मुझे यह कैसे करना है इस पर कोई विशिष्ट विचार नहीं है, लेकिन WMI शुरू करने के लिए एक अच्छी जगह की तरह लगता है। संपादित करें:Simon P Stevens उस भाग का उत्तर दिया।

तीसरा, मुझे लगता है कि आप इसके बारे में जानते हैं, लेकिन मैं इसे वैसे भी कहूंगा: आपकी समस्या लॉन्चर है। यदि यह इतना धीमा है कि सामान्य उपयोगकर्ताओं को इसके आसपास जाने का कोई तरीका मिलता है, तो यह बहुत धीमा है। आपका सबसे अच्छा समाधान मुख्य ऐप को ठीक नहीं करता है, लेकिन लॉन्चर को ठीक करने के लिए। संपादित करें: बेहतर तंत्र के लिए Anders Karlsson's answer देखें।

+0

"बहुत धीमी" बिट ज्यादातर WAN पर अपडेट खींचने का परिणाम है। ये अद्यतन पहले से ही सुविधाजनक भौगोलिक स्थानों पर वितरित किए गए हैं, और gzipped भी हैं। रिकॉर्ड के लिए, मुझे पूर्ववर्ती गुप्त दृष्टिकोण पसंद नहीं है –

+0

जिस तरह से मैंने आपके प्रश्न को समझ लिया, मैंने सोचा कि लोडर हमेशा * धीमा था, न केवल जब यह वास्तव में एक अद्यतन कर रहा था। मुझे सही साबित होना है ;-) – Treb

संबंधित मुद्दे