كيف يمكنك برمجيا تحديد ما إذا كان جهاز كمبيوتر ويندوز هو عضو في المجال ؟

StackOverflow https://stackoverflow.com/questions/206172

  •  03-07-2019
  •  | 
  •  

سؤال

أريد طريقة لتحديد ما إذا كان الكمبيوتر يعمل البرنامج انضم إلى أي مجال.لا يهم ما في مجال معين بل هو جزء من ، فقط ما إذا كان متصلا إلى أي شيء.أنا الترميز في vc++ ضد Win32 API.

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

المحلول

ومباشرة من مايكروسوفت:

كيفية تحديد إذا كان ويندوز NT / ويندوز 2000 الكمبيوتر عضوا المجال

وهذا النهج يستخدم API ويندوز. من ملخص المقال:

<اقتباس فقرة>   

وتوضح هذه المقالة كيفية   تحديد ما إذا كان الكمبيوتر الذي هو   يعمل بنظام التشغيل Windows NT 4.0 أو Windows 2000   هو عضو من مجال، عضو   مجموعة عمل، أو هو قائم بذاته   الكمبيوتر باستخدام الأمان المحلي   السلطة واجهات برمجة التطبيقات.

وتنص المادة أيضا على نموذج التعليمات البرمجية للبرنامج صغير النواتج ما إذا كان الكمبيوتر يعمل البرنامج على جزء من مجال، جزءا من مجموعة عمل أو جهاز كمبيوتر مستقل.

نصائح أخرى

وأعتقد أن NetServerEnum وظيفة سوف تساعدك في ما تريد؛ أود أن أسأل عن وحدات تحكم المجال الأساسية مع ثابت SV_TYPE_DOMAIN_CTRL ل <م> servertype المعلمة. إذا كنت لا تحصل على أي، ثم كنت لا في مجال.

ويمكنك التحقق من مفتاح التسجيل HKEY_LOCAL_MACHINE \ SOFTWARE \ مايكروسوفت \ ويندوز NT \ كرنتفرسون \ ينلوغن لقيمة 'CachePrimaryDomain ".

والتعليمات البرمجية في العينة MSDN قديمة بعض الشيء. هذه هي وظيفة خطرت لي أن تعمل.

bool ComputerBelongsToDomain()
{
    bool ret = false;

    LSA_OBJECT_ATTRIBUTES objectAttributes;
    LSA_HANDLE policyHandle;
    NTSTATUS status;
    PPOLICY_PRIMARY_DOMAIN_INFO info;

    // Object attributes are reserved, so initialize to zeros.
    ZeroMemory(&objectAttributes, sizeof(objectAttributes));

    status = LsaOpenPolicy(NULL, &objectAttributes, GENERIC_READ | POLICY_VIEW_LOCAL_INFORMATION, &policyHandle);
    if (!status)
    {
        status = LsaQueryInformationPolicy(policyHandle, PolicyPrimaryDomainInformation, (LPVOID*)&info);
        if (!status)
        {
            if (info->Sid)
                ret = true;

            LsaFreeMemory(info);
        }

        LsaClose(policyHandle);
    }

    return ret;
}

هنا هو ميت مقاربة بسيطة لا أرى المذكورة.

TCHAR UserDnsDomain[128] = { 0 }; 
DWORD Result = 0;

Result = GetEnvironmentVariable("USERDNSDOMAIN", UserDnsDomain, sizeof(UserDnsDomain));

if (Result == 0 || Result >= sizeof(UserDnsDomain) || GetLastError() == ERROR_ENVVAR_NOT_FOUND)
{
    return(FALSE); // Not logged in to a domain
}

هذا هو يقوم على فكرة أنه إذا كان المستخدم الذي يتم تشغيل هذه التعليمات البرمجية غير موجود حاليا تسجيل الدخول إلى المجال ، ثم USERDNSDOMAIN متغير البيئة سوف تكون فارغة أو غير متوفر.ولكن هناك بعض المحاذير يجب أن تفكر.

الايجابيات:

  • من السهل جدا لتنفيذ.
  • 99% موثوق بها.

سلبيات:

  • قد تفشل أو العودة نتائج خاطئة إذا كان الكمبيوتر هو المجال انضم ، ولكن المستخدم تنفيذ هذا القانون هو تسجيل الدخول إلى الكمبيوتر باستخدام حساب محلي.
  • قد تفشل أو العودة نتائج خاطئة إذا كان الكمبيوتر هو المجال انضم ، ولكن شبكة الاتصال إلى وحدة تحكم المجال غير متوفرة في وقت تسجيل الدخول/مستخدم بتسجيل الدخول باستخدام بيانات الاعتماد المخزنة مؤقتا.

وتجنب LSA وهي طريقة خاطئة. يجب استخدام DS المعهد (2 الأسطر من التعليمات البرمجية)

ماذا عن من اسم الكمبيوتر ؟

تحرير: كان هذا crapy "إجابة" من طريق العودة.ما قصدته هو cheching على شكل domain\name في اسم الكمبيوتر.وهذا بالطبع يعني أن كنت لا تعرف اسم المجال فإنه لا يحل المسألة من مجرد معرفة إذا كان الكمبيوتر في أي مجال.

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