Wie erhalte ich einen Windows-Domänennamen?

Wie erhalte ich einen Windows-Domänennamen?


Wie kann ich den Domänennamen der Maschine erhalten (wenn die Maschine tatsächlich einer Domäne angehört)?


Und wenn der Computer keiner Domäne angehört, sollte die Funktion natürlich

zurückgeben

  • null , oder

  • eine leere Zeichenfolge oder

  • Name der Maschine oder

  • "."


Notizen :



  • die NetGetJoinInformation Die Win32-Funktion gibt den alten NetBIOS-Namen der Domäne zurück (z. B. AVATOPIA ), nicht der Name der Domain (z. B. avatopia.local )


  • die USERDOMAIN Die Umgebungsvariable gibt die Domäne des angemeldeten Benutzers zurück, die sich von der Maschine unterscheiden kann; und gibt auch den alten NetBIOS-Namen der Domäne zurück (z. B. AVATOPIA )


  • die USERDNSDOMAIN Die Umgebungsvariable gibt den Domänennamen des angemeldeten Benutzers zurück, der sich vom Computer unterscheiden kann



Microsoft hat einen Knowledge-Base-Artikel zum Abrufen aktueller Benutzer- und Domänennamen unter Windows NT, Windows 2000 oder Windows XP, der darauf angewiesen ist, das Sicherheitstoken des Benutzers abzurufen und LookupAccountSid aufzurufen.



  • Die Win32-Funktion LookupAccountSid gibt den alten NetBIOS-Namen der Domäne zurück (z. B. AVATOPIA ); und gibt auch die Domäne des angemeldeten Benutzers zurück, die sich von der Maschine unterscheiden kann


Aktualisiere eins


Ich habe auch versucht, ADs-Objekt zu verwenden, um an IADs zu binden Schnittstelle der Domäne:


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

Problem mit diesem Ansatz ist, dass:



  • Sie können den Domänennamen nicht abrufen (nur den eindeutigen Namen )

  • es funktioniert nicht, wenn der Benutzer keine Berechtigungen zum Abfragen von AD hat

  • es funktioniert nicht, wenn der Benutzer kein gültiger Benutzer in Active Directory ist

  • funktioniert nur für Active Directory-Domains


Update Zwei :


Nur um klar zu sein, was ich will, ist:




  • welches Optionsfeld ausgewählt ist

  • Was ist in der (ausgewählten) Box


Bonuslektüre



  • Wie erhalte ich einen vollqualifizierten Domänennamen unter Windows in Delphi (Benutzerdomäne)

  • Domainname der Maschine in .NET? (von .NET)


Antworten:


Bitte schön:


#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\n", dw);
return dw;
}
if (info->DomainNameDns == NULL)
{
wprintf(L"DomainNameDns is NULL\n");
}
else
{
wprintf(L"DomainNameDns: %s\n", info->DomainNameDns);
}
return 0;
}

Jeder, der DsRoleGetPrimaryDomainInformation verwendet im produktiven Einsatz sollte der Aufruf von DsRoleFreeMemory erwogen werden um den Speicherblock freizugeben, wenn die Informationen nicht mehr benötigt werden (gemäß Diskussion in den Kommentaren).


Die Funktion gibt drei verschiedene Domainnamen zurück, z. B.:



  • Name der Domänengesamtstruktur :z.B. stackoverflow.com

  • Domain-DNS-Name :z.B. stackoverflow.com

  • Domänen-NetBIOS-Name :z.B. STACKOVERFLOW


Wenn der Computer keiner Domäne angehört, dann sind beide Forest und dns sind leer, wobei nur der NetBios-Name mit dem Namen der Arbeitsgruppe gefüllt ist, z. B.:



  • Name der Domänengesamtstruktur :null

  • Domain-DNS-Name :z.B. null

  • Domänen-NetBIOS-Name :z.B. WORKGROUP


Die Funktion gibt auch ein Flag zurück, das angibt, ob der Computer einer Domäne angehört:



  • DsRole_RoleMemberWorkstation :Arbeitsstation, die Mitglied einer Domäne ist

  • DsRole_RoleMemberServer :Server, der Mitglied einer Domäne ist

  • DsRole_RolePrimaryDomainController :primärer Domänencontroller

  • DsRole_RoleBackupDomainController :Domänencontroller sichern


oder nicht:



  • DsRole_RoleStandaloneWorkstation :Arbeitsstation, die kein Mitglied einer Domäne ist

  • DsRole_RoleStandaloneServer :Server, der kein Mitglied einer Domäne ist