मुझे यह निर्धारित करने का एक तरीका चाहिए कि मेरा प्रोग्राम चलाने वाला कंप्यूटर किसी भी डोमेन से जुड़ गया है या नहीं। इससे कोई फ़र्क नहीं पड़ता कि यह किस विशिष्ट डोमेन का हिस्सा है, भले ही यह किसी भी चीज़ से जुड़ा हुआ हो। मैं Win32 एपीआई के खिलाफ vC++ में कोडिंग कर रहा हूं।आप प्रोग्रामेटिक रूप से यह निर्धारित कैसे करते हैं कि कोई Windows कंप्यूटर किसी डोमेन का सदस्य है या नहीं?
उत्तर
सीधे:
How To Determine If a Windows NT/Windows 2000 Computer Is a Domain Member
यह दृष्टिकोण Windows API का उपयोग करता है। लेख सारांश से:
यह आलेख वर्णन करता है कि कैसे करने के लिए निर्धारित अगर वह यह है कि एक कंप्यूटर Windows NT 4.0 या Windows 2000 चल रहा , एक डोमेन का सदस्य है एक कार्यसमूह का एक सदस्य है, या एक है अकेले स्थानीय सुरक्षा प्राधिकरण API का उपयोग कर कंप्यूटर।
यह आलेख एक छोटे से प्रोग्राम के लिए नमूना कोड भी प्रदान करता है जो यह बताता है कि कंप्यूटर प्रोग्राम चालू है या नहीं, यह एक डोमेन का हिस्सा है, कार्यसमूह का हिस्सा है, या एक स्टैंडअलोन कंप्यूटर है।
ध्यान दें कि आप GENERIC_READ अनुमति को न मानें अगर आप यह जांचने जा रहे हैं कि मशीन डोमेन-जुड़ा हुआ है (और डोमेन नाम भी प्राप्त करें)। GENERIC_READ को ऊंचाई की आवश्यकता होती है, जबकि केवल POLICY_VIEW_LOCAL_INFORMATION का उपयोग नहीं करता है। – TripShock
कंप्यूटर के नाम से क्या?
संपादित करें: यह पीछे से एक कैफे 'उत्तर' था। मेरा मतलब कंप्यूटर नाम में फॉर्म domain\name
के लिए चेचिंग था। निश्चित रूप से यह दर्शाता है कि आप डोमेन के नाम को जानते हैं, यह केवल यह जानने के मुद्दे को हल नहीं करता है कि कंप्यूटर किसी भी डोमेन में है या नहीं।
जहां तक मुझे पता है, सभी विंडोज कंप्यूटरों का नाम होना चाहिए, भले ही वे नेटवर्क पर हों या नहीं। –
आप 'CachePrimaryDomain' के मान के लिए रजिस्ट्री कुंजी HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon को देख सकते हैं।
एमएसडीएन का कहना है कि यह कुंजी अब विंडोज 2000 के रूप में उपयोग में नहीं है, लेकिन पीछे की ओर compat के लिए रखा गया था। इससे मुझे आश्चर्य होता है कि क्या इसका उपयोग सुरक्षित है? – kgriffs
@kgriffs यह मेरी मशीन पर उपलब्ध नहीं है। –
मुझे लगता है कि NetServerEnum फ़ंक्शन आपको जो चाहिए वह आपकी मदद करेगा; मैं सर्टिपे पैरामीटर के लिए निरंतर प्राथमिक डोमेन नियंत्रकों से पूछूंगा। यदि आपको कोई नहीं मिलता है, तो आप किसी डोमेन में नहीं हैं।
Microsoft सेएमएसडीएन नमूना में कोड थोड़ा पुराना है। यह वह कार्य है जो मैं उन कार्यों के साथ आया था।
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;
}
एलएसए से बचें जो गलत तरीका है। आपको डीएस एपीआई (कोड की 2 लाइनें)
का उपयोग करना चाहिए, यहां एक मृत सरल दृष्टिकोण है जिसका उल्लेख मैंने नहीं देखा है।
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% विश्वसनीय।
विपक्ष:
- असफल या गलत परिणाम वापस अगर कंप्यूटर डोमेन है में शामिल हो गए, लेकिन इस कोड को क्रियान्वित करने उपयोगकर्ता एक स्थानीय खाते के साथ कि कंप्यूटर पर लॉग ऑन है हो सकता है।
- कंप्यूटर डोमेन में शामिल होने पर गलत परिणाम विफल हो सकता है या वापस लौटा सकता है, लेकिन डोमेन नियंत्रक के लिए नेटवर्क कनेक्टिविटी लॉगऑन/उपयोगकर्ता के कैश किए गए क्रेडेंशियल के साथ लॉग ऑन होने पर अनुपलब्ध था।
कोई डोमेन, या विशिष्ट डोमेन? शायद आप डब्लूएमआई चाहते हैं ... –
संबंधित प्रश्न [किसी विशेष डोमेन की जांच करें] (http://stackoverflow.com/q/4715512/588306) (और [सी #] में (http://stackoverflow.com/q/1290826/५,८८,३०६))। – Deanna