Toon posts:

[C# .NET 2.0] Windows service system events

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een windows service applicatie en wil erachter komen wanneer een gebruiker uitlogd.


Op http://support.microsoft....?scid=kb%3ben-us%3b151424

las ik dat dat met een Console Control handler kan.. toen ben ik op google gaan zoeken en nu heb ik de volgende code. Maar als ik nu de ingelogde gebruiker uitlog komen er 2 exceptions.

Dit zijn de 2 exception uit de eventlogs.

An unhandled exception ('System.Security.SecurityException') occurred in PacmClient.exe [2192]. Just-In-Time debugging this exception failed with the following error: Serveruitvoering is mislukt

EventType clr20r3, P1 pacmclient.exe, P2 1.0.0.0, P3 450534bd, P4 system, P5 2.0.0.0, P6 4333ae87, P7 3719, P8 115, P9 system.security.security, P10 NIL.


De service draaid onder het lokale systeemaccount.

Wat doe ik verkeerd? of is er nog een betere manier om erachter te komen wanner een gebruiker uitlogd ?


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
      
        
        // Declare the SetConsoleCtrlHandler function
        // as external and receiving a delegate. 

        [DllImport("Kernel32")]
        public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);

        // A delegate type to be used as the handler routine 
        // for SetConsoleCtrlHandler.
        public delegate bool HandlerRoutine(CtrlTypes CtrlType);

        // An enumerated type for the control messages
        // sent to the handler routine.
        public enum CtrlTypes
        {
            CTRL_C_EVENT = 0,
            CTRL_BREAK_EVENT,
            CTRL_CLOSE_EVENT,
            CTRL_LOGOFF_EVENT = 5,
            CTRL_SHUTDOWN_EVENT
        }

  private static bool ConsoleCtrlCheck(CtrlTypes ctrlType) 
        {
            switch (ctrlType)
            {
                case CtrlTypes.CTRL_C_EVENT:
                    EventLog.WriteEntry("Pacm service", "UserLogout 1");
                    break;
                case CtrlTypes.CTRL_BREAK_EVENT:
                    EventLog.WriteEntry("Pacm service", "UserLogout 2");
                    break;
                case CtrlTypes.CTRL_CLOSE_EVENT:
                    EventLog.WriteEntry("Pacm service", "UserLogout 3");
                    break;
                case CtrlTypes.CTRL_LOGOFF_EVENT:
                    EventLog.WriteEntry("Pacm service", "UserLogout 4");
                    break;
                case CtrlTypes.CTRL_SHUTDOWN_EVENT:
                    EventLog.WriteEntry("Pacm service", "UserLogout 5");
                    break;
                default:
                    break;
            }
            return true;
        }

        public MyConstructor()
        {
                 SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
        }

[ Voor 5% gewijzigd door Verwijderd op 11-09-2006 12:20 ]


  • RobLemmens
  • Registratie: Juni 2003
  • Laatst online: 10-02 16:09
Best kans dat je geen rechten hebt om weg te schrijven naar het eventlog, hang der eens een debugger aan. dan kun je ook zien waar hij eruit knalt. Hier kun je vinden hoe je je debugger aan de service gekoppeld krijgt.

Verwijderd

Topicstarter
ik heb wel rechten om naar het eventlog te schrijven want bij het starten van de service lukt het ook.
Debuggen gaat lastig omdat de fout pas optreed als de gebruiker uitlogd... en dan sluit visual studio dus ook al af.. Maar is dit wel een goede manier om het uitloggen van een gebruiker te detecteren ?

[ Voor 49% gewijzigd door Verwijderd op 11-09-2006 12:35 ]


  • cannibal
  • Registratie: Maart 2001
  • Laatst online: 12-02 17:08
Schrijf je bij het opstarten wel naar de zelfde "map" in de eventlog?

  • Viper®
  • Registratie: Februari 2001
  • Niet online
De event viewer heeft bij Security standaard userlogin/log off meldingen

Dus om terug te kunnen zien wanneer een gebruiker ingelogd is geweest etc. lijkt me dat voldoende

Verwijderd

Topicstarter
Ja dit is de code die ik bij de OnStart methode gebruik en dat werkt prima dus het schrijven naar het eventlog is het probleem niet. Dit dacht ik in het begin ook maar bij het schrijven naar een texfile krijg ik precies hetzelfde...

EventLog.WriteEntry("PacmClient", "Service Gestart");


Trouwens nog bedankt voor die link over het debuggen van een service.. dat is een stuk makkelijker dan helemaal de service installeren en dan attach to proccess enz...

Verwijderd

Topicstarter
Ik moet in mijn service weten wanneer de gebruiker uitlogd.. Kan je de eventlogs opvragen in de service ? En al zou dat kunnen dat staat toch niet overal aan dat hij dat die events gelogd worden..?

Verwijderd

Topicstarter
ik heb een site gevonden waar een compleet voorbeeld staat

http://www.microsoft.com/.../unix/ucamg/ch06uav4.mspx

nu krijg ik geen errors meer .. maar het event word ook niet getriggerd :'( :'( :'( :?

weet iemand een andere oplossing ???????????????????????????????


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
       protected override void OnStart(string[] args)
        {
                ConsoleAppCtrl cc = new ConsoleAppCtrl();
                cc.ControlEvent += new ConsoleAppCtrl.ControlEventHandler(cc_ControlEvent);
         }
         
    void cc_ControlEvent(ConsoleAppCtrl.ConsoleEvent consoleEvent)
        {
            switch (consoleEvent)
            {
                case ConsoleAppCtrl.ConsoleEvent.CTRL_C:
                    EventLog.WriteEntry("Pacm service", "UserLogout 1");
                    UserLogout();
                    break;
                case ConsoleAppCtrl.ConsoleEvent.CTRL_BREAK:
                    EventLog.WriteEntry("Pacm service", "UserLogout 2");
                    UserLogout();
                    break;
                case ConsoleAppCtrl.ConsoleEvent.CTRL_CLOSE:
                    EventLog.WriteEntry("Pacm service", "UserLogout 3");
                    UserLogout();
                    break;
                case ConsoleAppCtrl.ConsoleEvent.CTRL_LOGOFF:
                    EventLog.WriteEntry("Pacm service", "UserLogout 4");
                    UserLogout();
                    break;
                case ConsoleAppCtrl.ConsoleEvent.CTRL_SHUTDOWN:
                    EventLog.WriteEntry("Pacm service", "UserLogout 5");
                    UserLogout();
                    break;
                default:
                    break;
            }
        }


// Hier de class van de site


 /// <summary>
    /// Class to catch console control events (Ctrl+C,Ctrl+Break, etc) in C#.
    /// Calls SetConsoleCtrlHandler() in Win32 API
    /// </summary>
    public class ConsoleAppCtrl : IDisposable
    {
        /// <summary>
        /// Declaration of an enumeration (An enumeration listthat consists of a set of named constants)
        /// The events that can be captured by SetConsoleCtrlHandler()
        /// </summary>
        public enum ConsoleEvent
        {
            CTRL_C = 0,
            CTRL_BREAK = 1,
            CTRL_CLOSE = 2,
            CTRL_LOGOFF = 5,
            CTRL_SHUTDOWN = 6
        }
        /// <summary>
        /// Event Handler to be called when a console event occurs.
        /// </summary>
        public delegate void ControlEventHandler(ConsoleEvent
        consoleEvent);
        /// <summary>
        /// Event fired when a console event occurs
        /// </summary>
        public event ControlEventHandler ControlEvent;
        ControlEventHandler eventHandler;
        /// <summary>
        /// Create a new instance.
        /// </summary>
        public ConsoleAppCtrl()
        {
            eventHandler = new ControlEventHandler(Handler);
            SetConsoleCtrlHandler(eventHandler, true);
        }
        ~ConsoleAppCtrl()
        {
            Dispose(false);
        }
        public void Dispose()
        {
            Dispose(true);
        }
        /// <summary>
        /// Disposing the handler
        /// </summary>
        /// <param name="disposing"></param>
        void Dispose(bool disposing)
        {
            if (eventHandler != null)
            {
                SetConsoleCtrlHandler(eventHandler, false);
                eventHandler = null;
            }
        }
        /// <summary>
        /// Event Handler method that is called when the eventoccurs
        /// </summary>
        /// <param name="consoleEvent"></param>
        private void Handler(ConsoleEvent consoleEvent)
        {
            if (ControlEvent != null)
                ControlEvent(consoleEvent);
        }
        /// <summary>
        /// PInvoke usage of SetConsoleCtrlHandler present in kernel32.dll
        /// </summary>
        /// <param name="e"></param>
        /// <param name="add"></param>
        /// <returns></returns>
        [DllImport("kernel32.dll")] // PInvoke usage of Windows API //SetConsoleCtrlHandler
        static extern bool SetConsoleCtrlHandler
        (ControlEventHandler e, bool add);
    }
Pagina: 1