c ++ - Sådan får du Windows domænenavn?

Indlæg af Hanne Mølgaard Plasc

Problem



Hvordan kan jeg få domænenavnet på maskinen (hvis maskinen faktisk er sluttet til et domæne)?


Og selvfølgelig, hvis maskinen ikke er tilsluttet et domæne, skal funktionen returnere



  • null, eller

  • en tom streng eller

  • Maskinens navn, eller

  • "."



Noter :



  • Win32-funktionen returnerer det arvede NetBIOS-navn på domænet (f.eks. AVATOPIA), ikke navnet på domænet (f.eks. avatopia.local) [31]

  • Miljøvariablen USERDOMAIN returnerer domænet til den logget på bruger, som kan være forskellig fra maskinen. og returnerer også det arvede NetBIOS-navn på domænet (for eksempel AVATOPIA)

  • Miljøvariablen USERDNSDOMAIN returnerer domænenavnet til den logget bruger, som kan være forskellig fra maskinen



Microsoft har en videnbaseret artikel Sådan hentes aktuelle bruger- og domænenavne på Windows NT, Windows 2000 eller Windows XP, som afhænger af at få brugerens sikkerhedstoken og kalder LookupAccountSid. [32]



  • Funktionen LookupAccountSid Win32 returnerer domænet NetBIOS-navnet på domænet (f.eks. AVATOPIA); og returnerer også domænet til den logget på bruger, som kan være anderledes end maskinen



Opdater en



Jeg har også forsøgt at bruge ADs-objekt til at binde til domænet IADs af domænet:


IADs domain;
ADsGetObject("LDAP://rootDES", IDs, out domain);


Problemet med denne fremgangsmåde er at:



  • Du kan ikke få domænenavnet (kun fornemt navn )

  • Det virker ikke, hvis brugeren ikke har tilladelser til at søge AD

  • Det virker ikke, hvis brugeren ikke er en gyldig bruger i aktiv mappe

  • Den fungerer kun for Active Directory-domæner



Opdater to :


Bare for at være klar, hvad jeg vil, er:


Indtast billedbeskrivelse her



  • hvilken radioknap er valgt

  • Hvad er i boksen (valgt)



Bonuslæsning




  • Sådan får du fuldt kvalificeret domænenavn på Windows i Delphi (brugerens domæne)

  • Maskins domænenavn i .NET? (fra. NET)


Bedste reference


Her går du: [33]


#include <Windows.h>
#include <DSRole.h>

#pragma comment(lib, "netapi32.lib")

#include <stdio.h>

int main(int argc, char ** argv)
{
    DSROLE\_PRIMARY\_DOMAIN\_INFO\_BASIC * info;
    DWORD dw;

    dw = DsRoleGetPrimaryDomainInformation(NULL,
                                           DsRolePrimaryDomainInfoBasic,
                                           (PBYTE *)&info);
    if (dw != ERROR\_SUCCESS)
    {
        wprintf(L"DsRoleGetPrimaryDomainInformation: \%u
", dw);
        return dw;
    }

    if (info->DomainNameDns == NULL)
    {
        wprintf(L"DomainNameDns is NULL
");
    }
    else
    {
        wprintf(L"DomainNameDns: \%s
", info->DomainNameDns);
    }

    return 0;
}


Enhver, der bruger DsRoleGetPrimaryDomainInformation i produktionsbrug, bør overveje at kalde DsRoleFreeMemory for at frigøre hukommelsesblokken, når informationen ikke længere er nødvendig (som pr. Diskussion i kommentarerne). [36] [37]


Funktionen returnerer tre forskellige domænenavne, fx: [38]



  • Domænenavn : f.eks. stackoverflow.com

  • Domæne DNS-navn : f.eks. stackoverflow.com

  • Domain NetBIOS-navn : f.eks. STACKOVERFLOW



Hvis maskinen ikke er tilsluttet et domæne, er både Skov og dns blankt, med kun NetBios-navn udfyldt med navnet på arbejdsgruppen, f.eks .:



  • Domain Forest Name : null

  • Domæne DNS-navn : f.eks. null

  • Domain NetBIOS-navn : f.eks. WORKGROUP



Funktionen returnerer også et flag, der angiver, om maskinen er sluttet til et domæne:



  • DsRole\_RoleMemberWorkstation: arbejdsstation, der er medlem af et domæne

  • DsRole\_RoleMemberServer: server, der er medlem af et domæne

  • DsRole\_RolePrimaryDomainController: primær domænecontroller

  • DsRole\_RoleBackupDomainController: backup domænecontroller



eller ikke:



  • DsRole\_RoleStandaloneWorkstation: arbejdsstation, der ikke er medlem af et domæne

  • DsRole\_RoleStandaloneServer: server, der ikke er medlem af et domæne


Andre referencer 1


Ved hjælp af GetComputerNameEx kan du få dit computernavn og domænenavn. [39]


Eksempel:


TCHAR local[100];
DWORD hstSize = sizeof(local);
GetComputerNameEx(ComputerNameDnsDomain, local, &hstSize);


Bemærk: ComputerNameDnsDomain giver domænenavn og ComputerNameNetBIOS giver den lokale arbejdsgruppe (computer) navn. [40]

Andre referencer 2


Du kan hente domænenavnet via WMI ved at bruge Win32\_NTDomain-klassen. Linket indeholder yderligere links til prøver om, hvordan man interagerer med WMI. [41]