Wo ist die DsGetDc.h Datei?



  • Hallo Leute,

    also irgendwie treibt mich mein Visual Studio 2003 grad in den Wahnsinn. Ich möchte aus einem MFC Programmheraus meinen Domaincontroller ermitteln. Kein Problem, beispiel Sourcecode gibts genug in der MSDN.
    Nur wenn ich das ding jetzt kompilieren will erkennt er die Funktionen wie DsGetDcName, DsGetDcOpen,... nicht und das DsGetDC.h File ist auch nirgends auf meiner Platte zu finde.

    Kann mir jemand verraten wo ich das her bekomme?

    thx. Joe 😕



  • Genau weiß ich es nicht, aber vlt. sind die Dateien, die du suchst im Platform SDK enthalten.

    http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en



  • ja ich bin grad draufgekommen das es doch nicht daran liegen kann, das er die DsGetDc.h nicht findet.

    also ich haben folgenden Code:

    void ADSearch::getSites()
    {
    	DWORD dwret;
    	PDOMAIN_CONTROLLER_INFO pdcInfo;
    	dwret = DsGetDcName(NULL,NULL,NULL,NULL,0, &pdcInfo);
    	if(ERROR_SUCCESS == dwret)
    	{
    		HANDLE hGetDc;
    		dwret = DsGetDcOpen(pdcInfo->DomainName,
    							 DS_NOTIFY_AFTER_SITE_RECORDS,
    							NULL,
    							NULL,
    							NULL,
    							0,
    							&hGetDc);
    		if(ERROR_SUCCESS == dwret)
    		{
    			LPTSTR pszDnsHostName;
    			while(true)
    			{
    				ULONG ulSocketCount;
    				LPSOCKET_ADDRESS rgSocketAddresses;
    
    				dwret = DsGetDCNext(hGetDc,
    									&ulSocketCount,
    									&rgSocketAddresses,
    									&pszDnsHostName);
    				if(ERROR_SUCCESS == dwret)
    				{
    					MessageBox(NULL,
    								pszDnsHostName,
    								TEXT("NetPrint v 1.0"),
    								MB_ICONERROR);
    					NetApiBufferFree(pszDnsHostName);
    					LocalFree(rgSocketAddresses);
    				}
    				else if(ERROR_NO_MORE_ITEMS == dwret)
    				{
    					break;
    				}
    				else if(ERROR_FILEMARK_DETECTED == dwret)
    				{
    					MessageBox(NULL,
    								TEXT("Ende der lokalen Domain Controller"),
    								TEXT("NetPrint v 1.0"),
    								MB_ICONERROR);
    					continue;
    				}
    				else
    				{
    					break;
    				}
    			}
    			DsGetDcClose(hGetDc);
    		}
    		NetApiBufferFree(pdcInfo);
    	}
    }
    

    ich habe als include nur die DsGetDc.h, lm.h und winsock2.h und beim Linker die NetAPI32.lib angegeben wie es in MSDN Beispiel steht.

    Trotzdem bekomm ich vom Kompiler immer folgende Meldungen:

    error C2065: 'DS_NOTIFY_AFTER_SITE_RECORDS': nichtdeklarierter Bezeichner
    error C3861: 'DsGetDcOpen': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
    error C3861: 'DsGetNext': Bezeichner wurde auch mit einer argumentbezogenen suche nicht gefunden
    error C3861: 'DsGetDcClose': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

    Woran liegts bzw. hab ich nicht gedacht?

    thx. Joe



  • Also ich steh echt an, jetzt hab ich mir das Windows Platform SDK (R2) heruntergeladen und mir mal die Header Files DsGetDS und WinSock2 angeschaut.

    Die Funktionen DsGetDcOpen, DsGetDcNext und DsGetDcClose sind darin definiert, hier ein Auszug:

    #ifdef _WINSOCK2API_  // DsGetDcOpen/Next/Close depend on winsock2.h be included
    
    //
    // Option flags passed to DsGetDcOpen
    //
    
    #define DS_ONLY_DO_SITE_NAME         0x01   // Non-site specific names should be avoided.
    #define DS_NOTIFY_AFTER_SITE_RECORDS 0x02   // Return ERROR_FILEMARK_DETECTED after all
                                                //  site specific records have been processed.
    
    #define DS_OPEN_VALID_OPTION_FLAGS ( DS_ONLY_DO_SITE_NAME | DS_NOTIFY_AFTER_SITE_RECORDS )
    
    //
    // Valid DcFlags for DsGetDcOpen
    //
    
    #define DS_OPEN_VALID_FLAGS (       \
                DS_FORCE_REDISCOVERY  | \
                DS_ONLY_LDAP_NEEDED   | \
                DS_KDC_REQUIRED       | \
                DS_PDC_REQUIRED       | \
                DS_GC_SERVER_REQUIRED | \
                DS_WRITABLE_REQUIRED )
    
    DSGETDCAPI
    DWORD
    WINAPI
    DsGetDcOpenW(
        IN LPCWSTR DnsName,
        IN ULONG OptionFlags,
        IN LPCWSTR SiteName OPTIONAL,
        IN GUID *DomainGuid OPTIONAL,
        IN LPCWSTR DnsForestName OPTIONAL,
        IN ULONG DcFlags,
        OUT PHANDLE RetGetDcContext
        );
    
    DSGETDCAPI
    DWORD
    WINAPI
    DsGetDcOpenA(
        IN LPCSTR DnsName,
        IN ULONG OptionFlags,
        IN LPCSTR SiteName OPTIONAL,
        IN GUID *DomainGuid OPTIONAL,
        IN LPCSTR DnsForestName OPTIONAL,
        IN ULONG DcFlags,
        OUT PHANDLE RetGetDcContext
        );
    
    #ifdef UNICODE
    #define DsGetDcOpen DsGetDcOpenW
    #else
    #define DsGetDcOpen DsGetDcOpenA
    #endif // !UNICODE
    

    kann mir jemand verraten warum ich trotzdem beim Kompilieren die Information bekomme das die Funktionen nicht gefunden werden konnten?

    thx. Joe



  • Steht da nicht DsGetDcOpenW und DsGetDcOpenA? Du verwendest doch die alten Funktionen DsGetDcOpen ...



  • ja da ist das alte Lied mit den Unicode Varianten.
    Das läuft so das in Header File immer zwischen der Unicode und der Ascii Version unterschieden wird.
    wenn du allerdings das Makro #define UNICODE aufrufst nimmer er immer die Unicode Variante.

    DsGetDc.h:

    #ifdef UNICODE 
    #define DsGetDcOpen DsGetDcOpenW 
    #else 
    #define DsGetDcOpen DsGetDcOpenA 
    #endif // !UNICODE
    

    folglich ist der aufruf DsGetDcOpen absolut korrekt, oder hab ich das falsch verstanden?

    lg. Joe



  • Ok, ich hatte deinen Post nicht ganz bis zum Ende gelesen. Ich mag diese Art mit den defines umzugehen nicht so. Möglicherweise funktionierts ja so. Aber mal eine andere Frage. Welches BS nutzt du denn?



  • ja natürlich hann man auch gleich die Unicode Variante DsGetDcOpenW verwenden, nur das funktioniert in meinem Fall auch nicht. (gleiche Fehlermeldung vom Kompiler)

    Ich verwend ein Windows Xp sp2 mit Visual Studio .Net sp1 als Entwickler Platform. Laut MSDN sollte das nicht das Problem sein.

    lg. Joe



  • Und das hast du auch alles beachtet:

    MSDN schrieb:

    Requirements
    Client
    Requires Windows Vista or Windows XP.

    Server
    Requires Windows Server 2008 or Windows Server 2003.

    Header
    Declared in Dsgetdc.h.

    Library
    Use Netapi32.lib.

    DLL
    Requires Netapi32.dll.

    Unicode
    Implemented as DsGetDcOpenW (Unicode) and DsGetDcOpenA (ANSI).



  • ja freilich.

    -) die Maschine auf der ich das Programm laufen lasse ist Win Xp sp2
    -) die Domäne eine reine Win 2003 sp1 Domäne
    -) DsGetDc.h hab ich mit include hinzugefügt
    -) NetApi32.lib zum Linker hinzugefügt. (gut soweit kommt er nichtmal)

    also ich weiß echt nicht was da noch haken kann.

    lg. Joe


Anmelden zum Antworten