سؤال

هل هناك طريقة لإنشاء خدمة باستخدام C # قادرة على التحقق مما إذا كان هذا العميل مفتوحا؟

أحتاج إلى العمل وسيلة لأتمتة هذا التدقيق.

هل كانت مفيدة؟

المحلول

إذا كانت النافذة مفتوحة (لا تحتاج إلى أن تكون قيد التركيز)، فيمكنك استخدام مكالمة نافذة FindWindow من User32.dll للتحقق من النافذة. قم بتصفح الرمز أدناه ووضعه في الأماكن الصحيحة (للاستخدام، وحدد DLLIMPORT، والرمز الفعلي). سيخبرك هذا إذا كانت النافذة مفتوحة، فهناك الكثير يمكنك القيام به مع مكالمات Windows.

using System.Runtime.InteropServices;

[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)] static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

IntPtr hWnd = FindWindowByCaption(IntPtr.Zero,"Cisco vpn title here");
if(hWnd.ToInt64() == 0){
    Console.WriteLine("ERROR Could not find cisco vpn.");
}else{
    Console.WriteLine("Handle found");
}

نصائح أخرى

المشكلة في هذا العميل هي أنه يمكن إنهاء مكون واجهة المستخدم الرسومية "vpngui.exe" (غير مدرج في قائمة العمليات) ولكن واجهة الشبكات التي أنشأتها ستبقى مفتوحة.

وبالتالي، لا يمكن لخدمتك ببساطة التحقق لمعرفة ما إذا كانت العملية المسماة Vpngui.exe حية والركل، أولا عليك اكتشاف ما إذا كانت واجهة الشبكات قديمة. يمكنك تحقيق ذلك إما من إما عن طريق التحقق من إدخال تسجيل يكشف ما إذا كان النفق نشطا (انظر إحدى مشاركاتي الأخرى للحصول على التفاصيل)، أو عن طريق التحقق من وجود الواجهة المذكورة (مرة أخرى، راجع رسالتي الأخرى).

لذلك، ما عليك القيام به هو 1) تحقق مما إذا كان النفق نشطا 2) (اختياري) تحقق مما إذا كانت واجهة المستخدم الرسومية نشطة

يمكنك بعد ذلك تحديد ما يجب القيام به بعد ذلك، على سبيل المثال، يمكنك تعطيل واجهة الشبكات باستخدام واجهة CLI CISCO VPN CLI (أو أي خيار آخر يستند إلى Windows) ثم اقتل واجهة المستخدم الرسومية. بعد ذلك، يمكنك استخدام واجهة CLI لبدء مثيل جديد لعميل VPN الذي سيتصل تلقائيا بحساب / تسجيل الدخول / PCF الذي توفره كوسيطة لأمر CLI.

هيريس قليلا من التعليمات البرمجية: سيحقق ذلك لمعرفة ما إذا كان الجزء الأموري من القصة غير حية:

 Process[] processlist = Process.GetProcesses();
 string theProcessThatISeekIs = "";
                foreach (Process theprocess in processlist)  
                {
                    if (theprocess.ProcessName.ToString().ToLower() == NameOfTheProcessYouSeek.ToLower())
                    {

                        theProcessThatISeekIs = theprocess.ProcessName.ToString();
                        break;
                    }
                }

سيعود التعليمات البرمجية التالية اسم واجهة الشبكة التي تستخدمها Cisco، إذا إرجاع "notfound"، ثم الواجهة غير متوقفة.

string retVal = "";
        var nic = NetworkInterface
                  .GetAllNetworkInterfaces()
                  .Where(i => i.NetworkInterfaceType != NetworkInterfaceType.Loopback && i.NetworkInterfaceType != NetworkInterfaceType.Tunnel && i.Description == "Cisco Systems VPN Adapter");
        var name = nic.FirstOrDefault();
        if (name != null)
        {
            retVal = name.Name.ToString();

        }
        else
        {
            retVal = "NotFound";
        }
        return retVal;

مع هذين المقتطفين، يجب أن تكون قادرا على بناء حل لمشكلتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top