2009-06-10 22 views
46

क्या कोई प्रोग्राम है, यह पता लगाने के लिए कि कोई दूरस्थ डेस्कटॉप सत्र के अंदर से कोई प्रोग्राम चलाया जा रहा है या यदि प्रोग्राम .NET 2.0 में सामान्य चल रहा है? मैं जो करने की कोशिश कर रहा हूं वह है, मैं एक टाइमक्लॉक एप्लिकेशन बनाता हूं जो एक व्यक्ति को अंदर और बाहर घड़ी देगा और ट्रैक रखेगा। लेकिन मुझे लगता है कि यह विशेष व्यक्ति, घर पर, घर से, और घड़ी में और बाहर काम पर अपने कंप्यूटर में रिमोट कर रहा है।रिमोट डेस्कटॉप कनेक्शन का पता लगाना

कोई भी विचार मैं इस समस्या को कैसे हल कर सकता हूं (और दूरस्थ डेस्कटॉप पहुंच को दूर करना एक विकल्प नहीं है)? मेरा विचार है, अगर दूरस्थ डेस्कटॉप सत्रों का पता लगाने का कोई तरीका है, तो मैं इसे प्रोग्राम में लागू कर दूंगा और उन्हें दूरस्थ रूप से घड़ी से रोक सकता हूं।

+1

हा हा, कि एक दिलचस्प समस्या :) – willem

+3

एक समस्या यह है यहां विभिन्न दूरस्थ उपकरण की सीमा हो जाएगा है - mstsc और VNC बड़ा दावेदार हो जाएगा, लेकिन पीसीएनीवेयर, लाइव मेश, गोटोमीपीसी आदि के बारे में क्या, लाइव मीटिंग और एडोब कनेक्ट प्रो जैसी चीजों का जिक्र नहीं करना है, जो दोनों डेस्कटॉप रिमोटिंग कर सकते हैं। मजबूती से करने के लिए, यह बहुत मुश्किल हो सकता है। –

उत्तर

9

http://www.appdeploy.com/messageboards/tm.asp?m=21420&mpage=1&key=&#21420

प्रणाली चर% sessionname% कंसोल वापस आ जाएगी, तो अपने स्थानीय या आरडीपी * यदि इसके दूरदराज के।

isRDP = [System.Environment] 
    .GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-") 
+6

यदि आप आरएसपी/कंसोल स्विच (या/व्यवस्थापक, संस्करण के आधार पर) के साथ आरडीपी करते हैं, तो यह "कंसोल" (मैंने अभी जांच की है ;-p) –

+0

सिस्टम। पर्यावरण .. गेट पर्यावरण पर्यावरण ("SESSIONNAME")। स्टार्टविथ ("RDP-"); मेरे लिए काम किया – RaoulRubin

+0

मेरे रिटर्न कंसोल मेरे लिए आरडीपी पर। –

45
कथित तौर पर

,

System.Windows.Forms.SystemInformation.TerminalServerSession 

एक दूरस्थ डेस्कटॉप सत्र के लिए सच (या VNC सत्र)

हो जाएगा, लेकिन मैं यह यकीन है कि ;-) होने की

+6

मुझे अत्यधिक संदेह है कि यह वीएनसी सत्र उठाएगा। यह शायद आरडीपी का पता लगाएगा। –

+1

मैंने चेक किया है, और (% sessionname% के विपरीत - अन्य उत्तर) यह/कंसोल या व्यवस्थापक स्विच के साथ भी ठीक काम करता है। यह एमएसटीएससी के लिए सबसे अच्छा जवाब की तरह लगता है। –

+0

अच्छे वीएनसी सर्वर प्रदर्शन में सुधार के लिए ग्राफिक्स ड्राइवर में प्लग करते हैं। इसका पता लगाना संभव हो सकता है। –

2

तो परीक्षण था आप वीएनसी के बारे में चिंतित हैं, ऐसा लगता है कि netstat के साथ खुले टीसीपी कनेक्शन की जांच करना संभव होगा। एक कमांड प्रॉम्प्ट, प्रकार में:

netstat -n -a -p tcp 

और देखें कि क्या पोर्ट 5900 "स्थापित" कर रहा है। बेशक, 5 9 00 डिफ़ॉल्ट कनेक्शन पोर्ट है, इसलिए यह किस पोर्ट पर सेट है इस पर निर्भर करेगा।

वहाँ से, मैं this post at CodeGuru पाया बताते हैं कि अपने ग # कार्यक्रम में netstat का उपयोग कैसे करें:

string sCommand = "netstat"; 
string sArgs = ""; 
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo (sCommand, sArgs); 

psi.UseShellExecute = false; 
psi.RedirectStandartOutput = true; 

System.Diagnostics.Process proc = null; 
proc = System.Diagnostics.Process.Start(psi); 
proc.WaitForExit(); 

// Read the first 4 lines. They don't contain any information we need to get 
for (int i = 0; i < 4; i++) 
    proc.StandardOutput.ReadLine(); 

while (true) 
{ 
    string strLine = proc.StandardOutput.ReadLine(); 
    if (strLine == null) 
     break; 

    // Analyze the line 
    // Line is in following structure: 
    // Protocol (TCP/UDP) Local Address(host:port) Foreign Address(host:port) State(ESTABLISHED, ...) 
} 
+0

एक छोटा सा नोट: ऐसा लगता है कि कोडगुरु में पोस्ट किए गए कोड स्निपेट में एक वर्तनी त्रुटि है, उसमें 'मानक आउटपुट' को 'स्टैंडअर्टऑटपुट' –

14

तुम सिर्फ इस बात के लिए System.Windows.Forms.dll के लिए एक संदर्भ जोड़ने के लिए नहीं करना चाहते हैं (जैसा कि ऊपर का सुझाव दिया), तो आप भी अंतर्निहित प्रणाली कॉल सीधे PInvoke के माध्यम से कॉल कर सकते हैं, इस तरह:

int result = GetSystemMetrics(SystemMetric.SM_REMOTESESSION); 
    bool isRemoteSession = (result != 0); 

SystemMetric गणन PInvoke.net - SystemMetric में पाया जा सकता है (लेकिन तुम सिर्फ 0x1000 के मूल्य का उपयोग कर सकते हैं); जबकि PInvoke.net - GetSystemMetrics पर GetSystemMetrics के लिए हस्ताक्षर।

मैंने आरडीपी और वीएनसी के साथ इसका परीक्षण किया - पूर्व (व्यवस्थापक/कंसोल मोड भी) के साथ काम करता है, बाद वाले का पता नहीं लगाता है।

3

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

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

4

ठीक है, मेरे पास कुछ दिन पहले इसी तरह की समस्या थी। क्या मैं हल करने में यह था तथ्य का फायदा उठाया है कि कुछ दूरस्थ डेस्कटॉप आवेदन एक ज्ञात डिफ़ॉल्ट पोर्ट, कम से कम VNC और/या माइक्रोसॉफ्ट रिमोट डेस्कटॉप कनेक्शन का उपयोग करें। तो मैं एक तरीका है जिसके यदि बंदरगाह किया जा रहा है बताता है बनाया है, इस प्रकार है:

/* Libraries needed */ 
using System.Linq; 
using System.Net.NetworkInformation; 

/*.... 
    .... 
    ....*/ 

private static bool IsPortBeingUsed(int port) 
{ 
    return IPGlobalProperties.GetIPGlobalProperties(). 
       GetActiveTcpConnections(). 
        Any(
          tcpConnectionInformation => 
          tcpConnectionInformation.LocalEndPoint.Port == port 
         ); 
} 

फ़ाइल जहां विधि है की शुरुआत में पुस्तकालयों के साथ बयान का उपयोग कर डाल करने के लिए याद रखें।

तुम बस 3389 बंदरगाह जो रिमोट डेस्कटॉप कनेक्शन, या 5900 बंदरगाह जो VNC कनेक्शन लिए डिफ़ॉल्ट पोर्ट है लिए डिफ़ॉल्ट पोर्ट है की तरह एक पैरामीटर उदाहरण के लिए पारित करने के लिए की है।

विधि सी # 4.0 सुविधाओं के साथ बनाई गई है, लेकिन यह पूरी तरह से साथ और सी # नेट या विजुअल बेसिक के पुराने संस्करण से किया जा सकता।

यह मेरे लिए काम करता था क्योंकि मुझे केवल पहले उल्लेख किए गए दो आवेदनों की जांच करने की आवश्यकता थी।

मुझे उम्मीद है कि इससे मदद मिल सकती है।

7

Windows स्टोर ऐप्लिकेशन के लिए आपको इस का उपयोग कर सकते हैं:

Windows.System.RemoteDesktop.InteractiveSession.IsRemote 
+0

के रूप में गलत वर्तनी है, साथ ही सार्वभौमिक विंडोज प्लेटफार्म (यूडब्ल्यूपी) ऐप्स के साथ भी काम करता है। धन्यवाद! –

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