Tôi cần một cách để xác định xem máy tính đang chạy chương trình của tôi có được nối với bất kỳ miền nào không. Nó không quan trọng những gì cụ thể tên miền nó là một phần của, chỉ cho dù đó là kết nối với bất cứ điều gì. Tôi đang mã hóa trong vc + + so với API Win32.Làm thế nào để bạn có thể xác định xem máy tính Windows có phải là thành viên của miền không?
Trả lời
Trực tiếp từ Microsoft:
How To Determine If a Windows NT/Windows 2000 Computer Is a Domain Member
Cách tiếp cận này sử dụng API của Windows. Từ tóm tắt bài viết:
Bài viết này mô tả làm thế nào để xác định xem máy tính đó là chạy Windows NT 4.0 hoặc Windows 2000 là thành viên của một tên miền, là thành viên của một nhóm làm việc, hoặc là một độc lập máy tính bằng cách sử dụng các API bảo mật cục bộ .
Bài viết này cũng cung cấp mã mẫu cho một chương trình nhỏ xuất ra cho dù máy tính chương trình đang chạy là một phần của miền, một phần của nhóm làm việc hay máy tính độc lập.
Lưu ý rằng bạn không nead quyền GENERIC_READ nếu bạn sẽ chỉ kiểm tra xem máy có tham gia miền hay không (và cũng lấy tên miền). GENERIC_READ yêu cầu độ cao, trong khi chỉ sử dụng POLICY_VIEW_LOCAL_INFORMATION thì không. – TripShock
còn tên của máy tính thì sao?
chỉnh sửa: đây là một 'câu trả lời' crapy từ phía sau. Những gì tôi có nghĩa là cheching cho các hình thức domain\name
trong tên máy tính. Điều đó tất nhiên ngụ ý rằng bạn biết tên miền, nó không giải quyết được vấn đề chỉ biết nếu máy tính nằm trong bất kỳ miền nào.
Theo như tôi biết, tất cả các máy tính Windows phải có tên, bất kể chúng có đang ở trên mạng hay không. –
Bạn có thể kiểm tra khoá đăng ký HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon cho giá trị của 'CachePrimaryDomain'.
MSDN cho biết khóa này không còn được sử dụng như của Windows 2000, nhưng đã được giữ cho compat ngược. Điều này làm cho tôi tự hỏi nếu nó là an toàn để sử dụng? – kgriffs
@kgriffs Nó không có trên máy của tôi. –
Tôi nghĩ rằng chức năng NetServerEnum sẽ giúp bạn trong những gì bạn muốn; Tôi sẽ yêu cầu các bộ điều khiển tên miền chính với hằng số SV_TYPE_DOMAIN_CTRL
cho tham số servertype. Nếu bạn không nhận được bất kỳ, thì bạn không ở trong một miền.
Mã trong mẫu MSDN hơi lỗi thời. Đây là chức năng tôi đã đưa ra với công trình đó.
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;
}
Tránh LSA là phương pháp sai. Bạn phải sử dụng DS api (2 dòng mã)
Đây là một cách tiếp cận đơn giản đã chết mà tôi không thấy được đề cập.
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
}
Điều này được dựa trên ý tưởng rằng nếu người dùng đang chạy mã này hiện không đăng nhập vào miền thì biến môi trường USERDNSDOMAIN sẽ trống hoặc không khả dụng. Nhưng có một số điều bạn nên suy nghĩ.
Ưu điểm:
- Rất dễ dàng để thực hiện.
- 99% đáng tin cậy.
Nhược điểm:
- Có thể thất bại hoặc trả lại kết quả sai nếu máy tính là miền tham gia, nhưng người dùng thực thi mã này được đăng nhập vào máy tính với một tài khoản địa phương.
- Có thể không thành công hoặc trả về kết quả sai nếu máy tính tham gia miền, nhưng kết nối mạng với bộ điều khiển miền không khả dụng tại thời điểm đăng nhập/người dùng đã đăng nhập bằng thông tin đăng nhập được lưu trong bộ nhớ cache.
Bất kỳ tên miền hoặc miền cụ thể nào? Có lẽ bạn sẽ muốn WMI ... –
Câu hỏi liên quan đến [kiểm tra một miền cụ thể] (http://stackoverflow.com/q/4715512/588306) (và trong [C#] (http://stackoverflow.com/q/1290826/588306)). – Deanna