Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Help wanted: Process management, events, κλπ

Îåêßíçóå áðü ôï ìÝëïò KelMan. Τελευταία δημοσίευση από το μέλος KelMan στις 03-12-2004, 00:57. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-12-2004, 16:25 554

    Help wanted: Process management, events, κλπ

    Θέλω να φτιάξω μια εφαρμογούλα client/server όπου server side θα καθορίζονται ποια processes (managed και unmanaged) επιτρέπονται να τρέξουν στους clients και client side όταν ξεκινάει ένα process θα τσεκάρει από τον server αν επιτρέπεται η εκτέλεση ή όχι, οπότε και θα το τερματίζει.

     

    Με το System.Diagnostics.Process namespace υπάρχει η δυνατότητα να χειριστώ processes πέρα όμως από αυτό, χρειάζεται να κάνω catch κάποιο event που θα γίνεται fire όταν ξεκινάει κάποιο process. Για παράδειγμα, στο Microsoft.Win32.SystemEvents έχει κάποια ανάλογα events αλλά όχι για start.

     

    Έχει κανείς καμιά ιδέα; Θέλω να βρω κάποια λύση που να μην καταφεύγει σε dll call. Μήπως μέσα από το WMI θα μπορούσα να βγάλω άκρη;
    Vir prudens non contra ventum mingit
  •  02-12-2004, 13:08 558 σε απάντηση της 554

    Re: Help wanted: Process management, events, κλπ

    Πράγματι, μπορείς να πάρεις notification μέσω του WMI. Υπάρχει μάλιστα ένα ωραίο εργαλείο, το Scriptomatic το οποίο σου δημιουργεί έτοιμα scripts για να κάνεις διάφορα queries με WMI. 
      Φοβάμαι ότι μια λύση client/server θα είναι αργή για αυτή τη δουλειά. Ίσως θα ήταν καλύτερα να κατεβάζεις τη λίστα σε κάθε μηχάνημα περιοδικά σε ένα αρχείο και να κάνεις τοπικά τον έλεγχο.
      Όπως και να έχει, θα πρέπει να λάβεις υπόψη η εφαρμογή θα πρέπει να έχει τα απαραίτητα permissions για να τερματίσει άλλες εφαρμογές.
      Παρόμοια δουλειά μπορείς να κάνεις μέσω του Group Policy, με τα settings, "Don't Run specified Windows Applications", "Run only allowed Windows Applications" και "List of allowed applications". Αυτά όμως δουλεύουν μόνο όταν πας να ξεκινήσεις ένα process από τον Explorer.

    Σε VBScript η δουλειά γίνεται με το παρακάτω script:


    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

    Set MySink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")

    objWMIservice.ExecNotificationQueryAsync MySink, "SELECT * FROM __InstanceCreationEvent" & _
        " WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'"

    WScript.Echo "Waiting for events..."

    Sub SINK_OnObjectReady(objObject, objAsyncContext)
        WScript.Echo (objObject.TargetInstance.Name)
    End Sub


     

    Η ίδια δουλειά γίνεται στο .NET χρησιμοποιώντας το System.Management namespace και την κλάση ManagementEventWatcher:



    using System.Management;

    ...

    public class Form1 : System.Windows.Forms.Form

    {


    ...

    private
    ManagementEventWatcher _watcher;

    public Form1()

    {


    ...

    _watcher =new ManagementEventWatcher(@"\\.\root\cimv2",

    "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'");

    _watcher.EventArrived+=new EventArrivedEventHandler(_watcher_EventArrived);

    _watcher.Start();

    }

    ...

    protected override void Dispose( bool disposing )

    {

    if( disposing )

    {

    if (components != null)

    {

    components.Dispose();

    }

    _watcher.Stop();

    _watcher.Dispose();

    }

    base.Dispose( disposing );

    }


    ...


    private
    void _watcher_EventArrived(object sender, EventArrivedEventArgs e)

    {

    ManagementBaseObject eventArg = (ManagementBaseObject)(e.NewEvent["TargetInstance"]);

    Console.WriteLine(String.Format("Process Started = {0}",eventArg["NAME"]));

    }


     




    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-12-2004, 22:42 559 σε απάντηση της 558

    Geeked [8-|] Re: Help wanted: Process management, events, κλπ

    Ααααααα πολύ ωραία! Ευχαριστώ! Δουλεύει άψογα!

    Γενικά, το ζητούμενο είναι όταν server side ορίζω κάποια processes ότι είναι/δεν είναι επιτρεπτά, τότε θα πρέπει άμεσα οι clients να υπόκεινται στις αλλαγές... Όπερ σημαίνει ότι η περιοδική αποστολή της λίστας, το polling ή το Active Directory δεν γίνεται να χρησιμοποιθούν. Έτσι λοιπόν, με ένα service που θα τρέχει στον client, όταν ανεβαίνει κάποιο νέο process, θα επικοινωνεί με τον server, θα παίρνει το OK (ή όχι) και the rest is history...

    Όταν λές "αργή", που ακριβώς εντοπίζεις την αργοπορία; Γιατί με ένα proof-of-point Projectάκι που έφτιαξα βλέπω ότι από την στιγμή που θα γίνει kick το process, μέχρι να τρέξει το event, μεσολαβούν μερικά δευτερόλεπτα... Γι αυτό μιλάς;


    Vir prudens non contra ventum mingit
  •  02-12-2004, 23:06 560 σε απάντηση της 559

    Re: Help wanted: Process management, events, κλπ

    Αν έχεις πολλούς clients και δημιουργούνται συχνά processes θα πρέπει να εκτελείς συχνά το query στη βάση. Είναι θέμα scalability. Κάθε client θα πρέπει να κρατάει ανοικτή μια σύνδεση στη βάση και να εκτελεί το query. Ουσιαστικά εξαρτάται από το πόσα clients θα υπάρχουν. Αν μιλάμε για μερικές δεκάδες, δεν νομίζω ότι θα υπάρχει κανένα πρόβλημα. Θα πρέπει να κάνεις ένα stress test για να δεις τις πραγματικές επιπτώσεις.
      Μήπως θέλεις να φτιάξεις κάτι σε στυλ IDS ή application firewall? Στην περίπτωση αυτή η καθυστέρηση μερικών δευτερολέπτων δεν θα είναι αρκετή για να προλάβει το service να κλείσει κάποιο worm. Άσε που το όνομα του process από μόνο του δεν αρκεί, εύκολα μπορεί κάποιος να το αλλάξει.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  03-12-2004, 00:57 561 σε απάντηση της 560

    Re: Help wanted: Process management, events, κλπ

    Πράγματι, οι clients είναι γύρω στους 15 και στον server δεν θα υπάρχει βάση-βάση παρά ένα xml αρχείο με μια λίστα από επιτρεπόμενα processes ανά ομάδα χρηστών. Δεν χρειάζεται live connection, απλά ένας tcp listener στον server. Εξάλλου, με τον τρόπο που χρησιμοποιούνται οι clients δεν προβλέπεται να γίνεται διαρκές άνοιγμα εφαρμογών... Τέλος, το σκέφτικα το θέμα με τον όνομα του process και ενδεχομένων να κάνω implement κανένα hashing αλγόριθμο πάνω στα exe αρχεία ώστε να τα τσεκάρω με αυτόν τρόπο και να μπορώ να πιάσω και διαφορετικά versions του ίδιου exe... Όλα αυτά βλέποντας και κάνοντας...


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems