Windows 컴퓨터가 도메인의 구성원인지 프로그래밍 방식으로 어떻게 결정합니까?
문제
내 프로그램을 실행하는 컴퓨터가 모든 도메인에 결합되어 있는지 여부를 결정하는 방법이 필요합니다. 그것이 어떤 특정 도메인이 무엇인지, 그것이 무엇이든 연결되어 있는지는 중요하지 않습니다. Win32 API에 대해 VC ++로 코딩하고 있습니다.
해결책
Microsoft에서 바로 :
Windows NT/Windows 2000 컴퓨터가 도메인 멤버인지 확인하는 방법
이 방법은 Windows API를 사용합니다. 기사 요약에서 :
이 기사에서는 Windows NT 4.0 또는 Windows 2000을 실행하는 컴퓨터가 도메인의 구성원인지, 작업 그룹의 구성원인지 또는 로컬 보안 당국 API를 사용하는 독립형 컴퓨터인지 확인하는 방법에 대해 설명합니다.
이 기사는 또한 프로그램이 실행중인 컴퓨터가 도메인, 작업 그룹의 일부 또는 독립형 컴퓨터의 일부인지를 출력하는 작은 프로그램에 대한 샘플 코드를 제공합니다.
다른 팁
제 생각에는 Netserverenum 기능은 원하는대로 도움이됩니다. 나는 기본 도메인 컨트롤러를 SV_TYPE_DOMAIN_CTRL
일정합니다 ServerType 매개 변수. 당신이 아무것도 얻지 못하면, 당신은 도메인에 있지 않습니다.
'Cacheprimarydomain'의 값에 대해 레지스트리 키 hkey_local_machine Software Microsoft Windows NT CurrentVersion Winlogon을 확인할 수 있습니다.
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 API (2 줄의 코드)를 사용해야합니다.
컴퓨터 이름에서 어떻습니까?
편집하다: 이것은 상자 '대답'이었다. 내가 의미하는 바는 양식을 체코링하는 것이 었습니다 domain\name
컴퓨터 이름으로. 물론 도메인의 이름을 알고 있음을 의미하며 컴퓨터가 도메인에 있는지 아는 문제는 해결되지 않습니다.