Infos einer Domain abfragen
-
Hi,
ich schreib ein kleines Tool das Infos aus der Domain bzw den PDC abfragen soll.
Eine Liste der Domains bekomme ich mit: NetServerEnum und dem ServerType SV_TYPE_DOMAIN_ENUM. Nachdem ich die Domains habe versuch ich mit der gleichen Function, SV_TYPE_DOMAIN_CTRL als ServerType und als domain die vorher bekommenen Werte die PDC zu erfragen.Jetzt hab ich aber das Problem, dass das auf der Arbeit nicht geht. Ich bekomme keinen PDC. In meiner Testumgebung daheim funktioniert das wunderbar.
Muss ich jetzt da dann die uebergeordnete Domaine bzw Tree (oder?) herausfinden und das gleiche nochmal versuchen oder warum geht das nicht. Wenn ja kann mir einer sagen wie ich die bekommen.
Danke C0de4Fun
-
Ohne deinen Code wird niemand viel dazu sagen können (Wahrsager und echte Hexen ausgenommen).
PS: Ist CharSet = CharSet.Unicode (beliebter Fehler)?
-
schmidt-webdesign.net schrieb:
Ohne deinen Code wird niemand viel dazu sagen können (Wahrsager und echte Hexen ausgenommen).
PS: Ist CharSet = CharSet.Unicode (beliebter Fehler)?
Naja danke fuer die Antwort, aber ich hab ja eig schon alles oben geeschrieben. Ich kann gern den Code posten in dem ich NetServerEnum mit den verschiedenen ServerTypen aufrufen, aber ob das wirklich noetig ist mag ich bezweifeln.
Aber was solls. Hier der entsprechende Code:/* IMPORTANT: you have to call NetApiBufferFree for *ppBase after you got all the infos you need */ template< class T> static std::vector< T* > EnumNetServer( PDWORD pErrorCode, void** ppBase,const wchar_t* Domain, DWORD Level, DWORD Type) { T* pTmpBuf; DWORD TotalEntries; DWORD EntriesRead; std::vector<T*> Vec; *ppBase = NULL; *pErrorCode = NetServerEnum(NULL, Level, (LPBYTE*) ppBase, MAX_PREFERRED_LENGTH, &EntriesRead, &TotalEntries, Type, Domain, 0); if( *pErrorCode == NERR_Success || *pErrorCode == ERROR_MORE_DATA) { pTmpBuf = static_cast<T*> (*ppBase); if( pTmpBuf != NULL) { for( DWORD i = 0; i < EntriesRead; i++) { if( pTmpBuf != NULL ) { Vec.push_back( pTmpBuf ); } else { std::wcerr << "Entry is null" << std::endl; break; } pTmpBuf++; } } else std::wcerr << "Returned Buffer from NetServerEnum is null" << std::endl; } else std::wcerr << "NetServerEnum failed with: 0x" << std::hex << *pErrorCode << std::endl; return Vec; }DomainVec Domain::GetDomainList(PDWORD pErrorCode) { void** ppBase = new void*; std::vector< LPSERVER_INFO_100 > Domains = EnumNetServer< SERVER_INFO_100 > ( pErrorCode, ppBase, NULL, 100, SV_TYPE_DOMAIN_ENUM); DomainVec DomainStrings; if( *pErrorCode == NERR_Success) { for( std::vector< LPSERVER_INFO_100>::iterator iter = Domains.begin(); iter != Domains.end(); iter++ ) DomainStrings.push_back( std::wstring( (*iter)->sv100_name) ); NetApiBufferFree( *ppBase ); } delete ppBase; return DomainStrings; }Und zum Schluss noch:
void Domain::RetrieveDC() { DWORD ErrorCode; void** ppBase = new void*; std::vector< LPSERVER_INFO_100 > PrimaryDC = EnumNetServer< SERVER_INFO_100> ( &ErrorCode, ppBase, m_DomainName.c_str(), 100, SV_TYPE_DOMAIN_CTRL); if( ErrorCode == NERR_Success ) { for( std::vector< LPSERVER_INFO_100 >::iterator iter = PrimaryDC.begin(); iter != PrimaryDC.end(); iter++) m_PrimaryDC.push_back( std::wstring( (*iter)->sv100_name) ); NetApiBufferFree(*ppBase); } delete ppBase; }Und zum zweiten: benutze eigentlich nur wchar_t bzw std::wstring, aber auch in den Projekteinstellungen ist der Zeichensatz auf Unicode. Was aber in diesem Fall auch wieder egal ist weil bei den Net.. Funktionen gibts, afaik, nur die wide-char Variante.
Tut mir echt leid schmidt-webdesign.net aber imho war deine Antwort unqualifiziert.
Greetz
-
Unqualifizierte Antwort II: Versuch' mal, alle sichtbaren Server der Domäne aufzulisten (Flag: SV_TYPE_SERVER). Klappt hier fehlerfrei ...
Nachtrag: weiterführender Link