Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.
Keywords: IntControl 32 Byte Long Num2Char DsGetDcName Binary Buffer Structure _DOMAIN_CONTROLLER_INFOA Pointer
#DefineFunction fGetDC(sDomain) ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms675983(v=vs.85).aspx ;Flags to passed to DsGetDcName DS_FORCE_REDISCOVERY =xHex(00000001) DS_DIRECTORY_SERVICE_REQUIRED =xHex(00000010) DS_DIRECTORY_SERVICE_PREFERRED =xHex(00000020) DS_GC_SERVER_REQUIRED =xHex(00000040) DS_PDC_REQUIRED =xHex(00000080) DS_BACKGROUND_ONLY =xHex(00000100) DS_IP_REQUIRED =xHex(00000200) DS_KDC_REQUIRED =xHex(00000400) DS_TIMESERV_REQUIRED =xHex(00000800) DS_WRITABLE_REQUIRED =xHex(00001000) DS_GOOD_TIMESERV_PREFERRED =xHex(00002000) DS_AVOID_SELF =xHex(00004000) DS_ONLY_LDAP_NEEDED =xHex(00008000) DS_IS_FLAT_NAME =xHex(00010000) DS_IS_DNS_NAME =xHex(00020000) DS_TRY_NEXTCLOSEST_SITE =xHex(00040000) DS_DIRECTORY_SERVICE_6_REQ =xHex(00080000) ;ORIGINAL NAME "DS_DIRECTORY_SERVICE_6_REQUIRED" renamed since WB does not support vars longer than 30 chars DS_WEB_SERVICE_REQUIRED =xHex(00100000) DS_DIRECTORY_SERVICE_8_REQ =xHex(00200000) ;ORIGINAL NAME "DS_DIRECTORY_SERVICE_8_REQUIRED" renamed since WB does not support vars longer than 30 chars DS_RETURN_DNS_NAME =xHex(40000000) DS_RETURN_FLAT_NAME =xHex(80000000) ;// Structure returned from DsGetDcName ; ;typedef struct _DOMAIN_CONTROLLER_INFOA { ; total size = 48bytes ; LPSTR DomainControllerName; as lpStr, width: 4, offset: 0 ; LPSTR DomainControllerAddress; as lpStr, width: 4, offset: 4 ; ULONG DomainControllerAddressType; as long, width: 4, offset: 8 ; GUID DomainGuid; as int, width: 16, offset: 12 ; LPSTR DomainName; as lpStr, width: 4, offset: 28 ; LPSTR DnsForestName; as lpStr, width: 4, offset: 32 ; ULONG Flags; as long, width: 4, offset: 36 ; LPSTR DcSiteName; as lpStr, width: 4, offset: 40 ; LPSTR ClientSiteName; as lpStr, width: 4, offset: 44 ;} DOMAIN_CONTROLLER_INFOA, *PDOMAIN_CONTROLLER_INFOA; ;dllcall return values ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms681383(v=vs.85).aspx ERROR_SUCCESS =xHex(0) ;0 ERROR_INVALID_DOMAINNAME =xHex("4BC") ;1212 ERROR_INVALID_FLAGS =xHex("3EC") ;1004 ERROR_NOT_ENOUGH_MEMORY =xHex(8) ;8 ERROR_NO_SUCH_DOMAIN =xHex("54B") ;1355 cbSize=48 ;callback structure size calculated above _DOMAIN_CONTROLLER_INFOA=BinaryAlloc(cbSize) BinaryEodSet(_DOMAIN_CONTROLLER_INFOA, cbSize) dll_NetAPI32=DllLoad(DirWindows(1):"Netapi32.dll") ret_dsGetDCName=DllCall(dll_NetAPI32, word:"DsGetDcNameA", lpNull, lpstr:sDomain, lpNull, lpNull, long:DS_IS_DNS_NAME, lpBinary:_DOMAIN_CONTROLLER_INFOA) sDC=BinaryPeekStr(_DOMAIN_CONTROLLER_INFOA, 0, 4) DllFree(dll_NetAPI32) BinaryFree(_DOMAIN_CONTROLLER_INFOA) Pause("Function Return: ":ret_dsGetDCName, "Domain Controller: ":sDC) Return(ret_dsGetDCName) #EndFunction AddExtender("wilx44i.dll") fGetDC(AskLine("Get DC Function", "Enter full domain name:", "", 0)) Exit
You will need to use IntControl 32 to get the structure's first element string pointer. Here is the revied code:
#DefineFunction fGetDC(sDomain) ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms675983(v=vs.85).aspx ;Flags to passed to DsGetDcName DS_FORCE_REDISCOVERY =xHex(00000001) DS_DIRECTORY_SERVICE_REQUIRED =xHex(00000010) DS_DIRECTORY_SERVICE_PREFERRED =xHex(00000020) DS_GC_SERVER_REQUIRED =xHex(00000040) DS_PDC_REQUIRED =xHex(00000080) DS_BACKGROUND_ONLY =xHex(00000100) DS_IP_REQUIRED =xHex(00000200) DS_KDC_REQUIRED =xHex(00000400) DS_TIMESERV_REQUIRED =xHex(00000800) DS_WRITABLE_REQUIRED =xHex(00001000) DS_GOOD_TIMESERV_PREFERRED =xHex(00002000) DS_AVOID_SELF =xHex(00004000) DS_ONLY_LDAP_NEEDED =xHex(00008000) DS_IS_FLAT_NAME =xHex(00010000) DS_IS_DNS_NAME =xHex(00020000) DS_TRY_NEXTCLOSEST_SITE =xHex(00040000) DS_DIRECTORY_SERVICE_6_REQ =xHex(00080000) ;ORIGINAL NAME "DS_DIRECTORY_SERVICE_6_REQUIRED" renamed since WB does not support vars longer than 30 chars DS_WEB_SERVICE_REQUIRED =xHex(00100000) DS_DIRECTORY_SERVICE_8_REQ =xHex(00200000) ;ORIGINAL NAME "DS_DIRECTORY_SERVICE_8_REQUIRED" renamed since WB does not support vars longer than 30 chars DS_RETURN_DNS_NAME =xHex(40000000) DS_RETURN_FLAT_NAME =xHex(80000000) ;// Structure returned from DsGetDcName ; ;typedef struct _DOMAIN_CONTROLLER_INFOA { ; total size = 48bytes ; LPSTR DomainControllerName; as lpStr, width: 4, offset: 0 ; LPSTR DomainControllerAddress; as lpStr, width: 4, offset: 4 ; ULONG DomainControllerAddressType; as long, width: 4, offset: 8 ; GUID DomainGuid; as int, width: 16, offset: 12 ; LPSTR DomainName; as lpStr, width: 4, offset: 28 ; LPSTR DnsForestName; as lpStr, width: 4, offset: 32 ; ULONG Flags; as long, width: 4, offset: 36 ; LPSTR DcSiteName; as lpStr, width: 4, offset: 40 ; LPSTR ClientSiteName; as lpStr, width: 4, offset: 44 ;} DOMAIN_CONTROLLER_INFOA, *PDOMAIN_CONTROLLER_INFOA; ;typedef struct _DOMAIN_CONTROLLER_INFOA { ; total size = 1660bytes ; LPSTR DomainControllerName; as lpStr, width: 256, offset: 0 ; LPSTR DomainControllerAddress; as lpStr, width: 256, offset: 255 ; ULONG DomainControllerAddressType; as long, width: 4, offset: 512 ; GUID DomainGuid; as int, width: 16, offset: 516 ; LPSTR DomainName; as lpStr, width: 256, offset: 632 ; LPSTR DnsForestName; as lpStr, width: 256, offset: 888 ; ULONG Flags; as long, width: 4, offset: 1144 ; LPSTR DcSiteName; as lpStr, width: 256, offset: 1148 ; LPSTR ClientSiteName; as lpStr, width: 256, offset: 1404 ;} DOMAIN_CONTROLLER_INFOA, *PDOMAIN_CONTROLLER_INFOA; ;dllcall return values ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms681383(v=vs.85).aspx ERROR_SUCCESS =xHex(0) ;0 ERROR_INVALID_DOMAINNAME =xHex("4BC") ;1212 ERROR_INVALID_FLAGS =xHex("3EC") ;1004 ERROR_NOT_ENOUGH_MEMORY =xHex(8) ;8 ERROR_NO_SUCH_DOMAIN =xHex("54B") ;1355 hppDC = BinaryAlloc(4) dll_NetAPI32=DllLoad(DirWindows(1):"Netapi32.dll") ret_dsGetDCName=DllCall(dll_NetAPI32, long:"DsGetDcNameA", lpNull, lpstr:sDomain, lpNull, lpNull, long:DS_RETURN_DNS_NAME, lpbinary:hppDC) ;;DS_IS_FLAT_NAME DS_RETURN_DNS_NAME sDc = "" ppDC = BinaryPeek4( hppDC, 0) pStr = IntControl(32,ppDC, "LONG", 0,0) ; Structure's first element string pointer here. cValue = IntControl(32, pStr , "BYTE", 0,0) While cValue sDc = sDc:Num2Char(cValue) pStr = pStr + 1 cValue = IntControl(32,pStr, "BYTE", 0,0) EndWhile DllCall(dll_NetAPI32, long:"NetApiBufferFree", long:ppDC) BinaryFree(hppDC) DllFree(dll_NetAPI32) Pause("Function Return: ":ret_dsGetDCName, "Domain Controller: ":sDC) Return(ret_dsGetDCName) #EndFunction AddExtender("wilx44i.dll") fGetDC(AskLine("Get DC Function", "Enter full domain name:", "", 0)) Exit
Article ID: W17792
Filename: IntControl 32 and Structures.txt
File Created: 2014:07:18:09:50:36
Last Updated: 2014:07:18:09:50:36