2008-10-29 3 views
8

मैं ऐसी सेवा पर काम कर रहा हूं जिसे एक ही मशीन पर लॉग इन किए गए सभी उपयोगकर्ता के लिए उपयोगकर्ता राज्यों का पता लगाने की आवश्यकता है। विशेष रूप से, मैं यह देखने के लिए जांचना चाहता हूं कि स्क्रीन सेवर सक्रिय है या नहीं और उनका सत्र लॉक है या नहीं।सेवा को पता लगाने की आवश्यकता है कि वर्कस्टेशन लॉक है या नहीं, और स्क्रीन सेवर सक्रिय है

यह कोड सिस्टम-स्तरीय सेवा के तहत चलाएगा, और इसमें कोई दृश्य UI नहीं होगा, जिससे कई विकल्प (डब्लूएम संदेश फंसाने आदि) को रद्द कर दिया जा सके।

सामान्य वर्कस्टेशन के अलावा, मैं इसे टर्मिनल सर्वर पर काम करना चाहता हूं जिसमें एकाधिक उपयोगकर्ता लॉग इन हैं। इन आवश्यकताओं के कारण मैं सोच रहा हूं कि कई Win32 API को शामिल करने की आवश्यकता होगी या नहीं।

कहां से शुरू करना है?

उत्तर

4

सबसे सरल तरीका प्रत्येक उपयोगकर्ता के सत्र में एक छोटा ऐप चलाना होगा। इस ऐप का प्रत्येक उदाहरण सेवा के मुख्य उदाहरण के साथ संवाद कर सकता है।

विंडोज लॉगऑन सत्र अलग रखने के लिए बहुत मेहनत करता है - दोनों सेवाओं और इंटरैक्टिव डेस्कटॉप के बीच, और व्यक्तिगत टर्मिनल सेवा सत्रों के बीच - इसलिए उपयोगकर्ता के सत्र के बारे में इस प्रकार की जानकारी तक पहुंचने में बहुत मुश्किल हो जाती है जब तक कि आपका ऐप न हो शुरू करने के लिए उस सत्र में चल रहा है।

+0

धन्यवाद, मैं इसे एक दूंगा। शायद यह करने के लिए एक सरल सॉकेट सबसे अच्छा तरीका होगा। –

1

स्क्रीनसेवर चाहिए विस्तार .scr है, तो आप चल रहे प्रक्रियाओं क्वेरी सकता है ......

2

एक अधिक आसान समाधान की जाँच करने के कितनी देर तक उन है Cassia है, जो विभिन्न टीएस एपीआई लपेटता, उपयोग करने के लिए किया जाएगा के लिए निष्क्रिय:

using Cassia; 

foreach (ITerminalServicesSession session in new TerminalServicesManager().GetSessions()) 
{ 
    if ((session.CurrentTime - session.LastInputTime > TimeSpan.FromMinutes(10)) && 
     (!string.IsNullOrEmpty(session.UserName))) 
    { 
     Console.WriteLine("Session {0} (User {1}) is idle", session.SessionId, session.UserName); 
    } 
} 
19

एक सर्विसेज के रूप में आप अपने सभी प्रासंगिक क्षणों को पकड़ने के लिए OnSessionChange ईवेंट का उपयोग कर सकते हैं।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceProcess; 
using System.Diagnostics; 

namespace MyCode 
{ 
    class MyService : ServiceBase 
    { 
     public MyService() 
     { 
      this.CanHandleSessionChangeEvent = true; 
     } 

     protected override void OnSessionChange(SessionChangeDescription changeDescription) 
     { 
      switch (changeDescription.Reason) 
      { 
       case SessionChangeReason.SessionLogon: 
        Debug.WriteLine(changeDescription.SessionId + " logon"); 
        break; 
       case SessionChangeReason.SessionLogoff: 
        Debug.WriteLine(changeDescription.SessionId + " logoff"); 
        break; 
       case SessionChangeReason.SessionLock: 
        Debug.WriteLine(changeDescription.SessionId + " lock"); 
        break; 
       case SessionChangeReason.SessionUnlock: 
        Debug.WriteLine(changeDescription.SessionId + " unlock"); 
        break; 
      } 

      base.OnSessionChange(changeDescription); 
     } 
    } 
} 

मुझे यकीन है कि परिवर्तन के आधार पर उपयोगकर्ता की पहचान करना संभव है। सत्र आईडी। लेकिन इस समय मैं पता नहीं कैसे ...

संपादित करें: यह एक संभावना होना चाहिए

public static WindowsIdentity GetUserName(int sessionId) 
    { 
     foreach (Process p in Process.GetProcesses()) 
     { 
      if(p.SessionId == sessionId) {      
       return new WindowsIdentity(p.Handle);       
      }     
     } 
     return null; 
    } 

MSDN लिंक

+0

GetUserName कोड मेरे लिए काम नहीं करता है (अपवाद फेंकता है)। हालांकि, मुझे यहां कोड मिला जो आवश्यक था: http://msmvps.com/blogs/siva/archive/2006/10/02/Getting-Windows-Process-Owner-Name.aspx – Kramii

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

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