2009-02-15 20 views
13

पर लॉग ऑन नहीं है, तो मैं एक विंडोज सेवा एप्लिकेशन लिख रहा हूं जो कनेक्शन के लिए सुनता है और कुछ कार्यों को निष्पादित करता है जैसा कि नेटवर्क पर किसी अन्य कंप्यूटर पर चल रहे किसी अन्य एप्लिकेशन से निर्देशित किया जाता है।जांचें कि कोई उपयोगकर्ता वर्तमान में Windows

कार्यों में से एक यह सुनिश्चित करता है कि कोई उपयोगकर्ता वर्तमान में लॉग ऑन नहीं है, वर्कस्टेशन लॉक करता है, कुछ फ़ाइलों को हटा देता है, और फिर सिस्टम को पुनरारंभ करता है। मैंने चल रहे प्रक्रियाओं की सूची देखने के लिए this solution का उपयोग करने पर विचार किया और उपयोगकर्ता नामों की जांच की, यह निर्धारित करना कि सिस्टम, सिस्टम, आदि के खिलाफ उपयोगकर्ता नामों से मेल खाने पर कोई उपयोगकर्ता लॉग ऑन नहीं है। मुझे एहसास हुआ कि मेरे पास PostgreSQL चल रहा है जो पोस्टग्रेस नामक उपयोगकर्ता खाते का उपयोग करता है तो यह काम नहीं करेगा। यह जांच कर रहा है कि explorer.exe चल रहा है या नहीं, क्योंकि एक्सप्लोरर कभी-कभी दुर्घटनाग्रस्त हो जाता है, या मैं कभी-कभी प्रक्रिया को समाप्त करता हूं और इसे पुनरारंभ करता हूं।

यह निर्धारित करने का एक अच्छा तरीका क्या होगा कि कोई उपयोगकर्ता C# का उपयोग कर वर्कस्टेशन पर लॉग ऑन नहीं है?

+1

बहुत बहुत धन्यवाद। मैं डब्लूएमआई का उपयोग करने में बहुत अच्छा नहीं हूं और त्रुटि के बाद त्रुटि मारने के बाद, फ्लोडिन के जवाब के लिए जाने का फैसला किया। यहां रुचि रखने वाले किसी और के लिए नमूना उपयोग है: http://www.pinvoke.net/default.aspx/wtsapi32/WTSEnumerateSessions.html – Zahymaka

उत्तर

16

यह निर्धारित करने के लिए कि कोई भी स्थानीय रूप से लॉग ऑन है या नहीं, WTSGetActiveConsoleSessionId() का उपयोग करें। यह निर्धारित करने के लिए WTSEnumerateSessions() का उपयोग करें कि क्या कोई सत्र है (दूरस्थ टर्मिनल सेवा सत्र सहित)।

2

आप इस्तेमाल कर सकते हैं WMI

select UserName from Win32_ComputerSystem 
+0

अगर कोई इसे कम करता है, तो कृपया एक स्पष्टीकरण प्रदान करें। क्या जवाब गलत है? या क्या ऐसा करने के लिए बेहतर तरीके हैं? – DOK

+0

मुझे यह जवाब पसंद नहीं है, हालांकि, वोट-वोटिंग नहीं। – unixman83

3

CodeProject लेख "Using the Local Security Authority to Enumerate User Sessions in .NET" क्या आप देख रहे हैं हो सकता है। कोड उपयोगकर्ताओं को बताता है और यह पहचान सकता है कि कौन से उपयोगकर्ता (यदि कोई हैं) इंटरैक्टिव हैं (यानी, जो उपयोगकर्ता वास्तविक लोग हैं)।

4

यदि आप पी/इनवॉक्स से निपटना नहीं चाहते हैं तो एक और विकल्प: Cassia का उपयोग करें।

using Cassia; 

public static bool IsSomeoneLoggedOn(string server) 
{ 
    foreach (ITerminalServicesSession session in new TerminalServicesManager().GetSessions(server)) 
    { 
     if (!string.IsNullOrEmpty(session.UserName)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

यह सी # के लिए एक अच्छा जवाब है! यह ऊपर उठाया जाना चाहिए। – unixman83

2

आप explorer.exe या नहीं चल रहा है कि क्या जांच करने के लिए कोशिश की। winlogon.exe प्रक्रिया के लिए क्यों नहीं जाते?

public bool isLoggedOn() 
{ 
    Process[] pname = Process.GetProcessesByName("winlogon"); 
    if (pname.Length == 0) 
     return false; 
    else 
     return true; 
} 
संबंधित मुद्दे