Windows 컴퓨터가 도메인의 구성원인지 프로그래밍 방식으로 어떻게 결정합니까?

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

  •  03-07-2019
  •  | 
  •  

문제

내 프로그램을 실행하는 컴퓨터가 모든 도메인에 결합되어 있는지 여부를 결정하는 방법이 필요합니다. 그것이 어떤 특정 도메인이 무엇인지, 그것이 무엇이든 연결되어 있는지는 중요하지 않습니다. 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 컴퓨터 이름으로. 물론 도메인의 이름을 알고 있음을 의미하며 컴퓨터가 도메인에 있는지 아는 문제는 해결되지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top