PUBLIC ARRAY aUsers(1) AUsers(1)="" PRIVATE i, lcNewRemote i=0 lcNewRemote="" DO decl #DEFINE RESOURCE_CONNECTED 1 #DEFINE RESOURCE_GLOBALNET 2 #DEFINE RESOURCE_REMEMBERED 3 #DEFINE RESOURCE_RECENT 4 #DEFINE RESOURCE_CONTEXT 5 #DEFINE RESOURCETYPE_ANY 0 #DEFINE RESOURCETYPE_DISK 1 #DEFINE RESOURCETYPE_PRINT 2 #DEFINE RESOURCEUSAGE_CONNECTABLE 1 #DEFINE RESOURCEUSAGE_CONTAINER 2 #DEFINE RESOURCEUSAGE_ATTACHED 16 #DEFINE RESOURCEUSAGE_ALL 19 #DEFINE RESOURCEDISPLAYTYPE_DOMAIN 1 #DEFINE RESOURCEDISPLAYTYPE_SERVER 2 #DEFINE RESOURCEDISPLAYTYPE_GROUP 5 #DEFINE RESOURCEDISPLAYTYPE_NETWORK 6 #DEFINE RESOURCEDISPLAYTYPE_ROOT 7 #DEFINE NO_ERROR 0 #DEFINE ERROR_MORE_DATA 234 #DEFINE ERROR_NO_MORE_ITEMS 259 #DEFINE NETRESOURCE_SIZE 32 LOCAL hEnum, lnResult hEnum = 0 lnResult = WNetOpenEnum (RESOURCE_CONTEXT, RESOURCETYPE_ANY,; 0, 0, @hEnum) IF lnResult <> NO_ERROR * ERROR_INVALID_PARAMETER = 87 * ERROR_NOT_CONTAINER = 1207 * ERROR_EXTENDED_ERROR = 1208 * ERROR_NO_NETWORK = 1222 lcMsg="Unable to start enumeration." lcCode= lnResult *? "Unable to start enumeration." *? "Error code:", lnResult RETURN ENDIF LOCAL lnCount, lcBuffer, lnBufsize, ii, lcEntry lnCount = -1 && requesting as many entries as possible lnBufsize = 16384 && should be large enough lcBuffer = Repli(Chr(0), lnBufsize) lnResult = WNetEnumResource (hEnum, @lnCount,; @lcBuffer, @lnBufsize) IF lnResult <> NO_ERROR lcMsg= "WNetEnumResource call failed." lcCode= lnResult *?"Error code:", lnResult *?"WNetEnumResource call failed." ELSE *? "Number of entries read:", lnCount FOR ii=1 TO lnCount lcEntry = SUBSTR(lcBuffer, (ii-1)*NETRESOURCE_SIZE + 1, NETRESOURCE_SIZE) = SaveEntry(lcEntry) ENDFOR ENDIF = WNetCloseEnum (hEnum) IF USED('csResult') USE IN csResult ENDIF RETURN PROCEDURE SaveEntry (lcEntry) *|typedef struct _NETRESOURCE { *| DWORD dwScope; 0:4 *| DWORD dwType; 4:4 *| DWORD dwDisplayType; 8:4 *| DWORD dwUsage; 12:4 *| LPTSTR lpLocalName; 16:4 *| LPTSTR lpRemoteName; 20:4 *| LPTSTR lpComment; 24:4 *| LPTSTR lpProvider; 28:4 *|} NETRESOURCE; total bytes = 32 LOCAL lnScope, lnType, lnDisplayType, lnUsage,; lcLocalName, lcRemoteName, lcComment, lcProvider lnScope = buf2dword(SUBSTR(lcEntry, 1,4)) lnType = buf2dword(SUBSTR(lcEntry, 5,4)) lnDisplayType = buf2dword(SUBSTR(lcEntry, 9,4)) lnUsage = buf2dword(SUBSTR(lcEntry, 13,4)) lcLocalName = mem2str(buf2dword(SUBSTR(lcEntry, 17,4))) lcRemoteName = mem2str(buf2dword(SUBSTR(lcEntry, 21,4))) IF LEN(ALLTRIM(lcRemoteName))>2 lcNewRemote=RIGHT(lcRemoteName,LEN(ALLTRIM(lcRemoteName))-RAT('\\',lcRemoteName)-1) IF ALEN(Ausers,1)=1 .and. Ausers(1)="" AUsers(1)=lcNewRemote ELSE i=ALEN(Ausers,1)+1 DIMENSION AUsers(i) AUsers(i)=lcNewRemote ENDIF * ?lcNewRemote ENDIF lcComment = mem2str(buf2dword(SUBSTR(lcEntry, 25,4))) lcProvider = mem2str(buf2dword(SUBSTR(lcEntry, 29,4))) IF Not USED("csResult") CREATE CURSOR csResult (dwscope N(16), dwtype N(16), dwdispl N(16),; dwusage N(16), localname C(50), remotename C(50), comment C(50),; provider C(50)) ENDIF INSERT INTO csResult VALUES (lnScope, lnType, lnDisplayType, lnUsage,; lcLocalName, lcRemoteName, lcComment, lcProvider) RETURN PROCEDURE decl DECLARE INTEGER WNetOpenEnum IN mpr; INTEGER dwScope, INTEGER dwType, INTEGER dwUsage,; INTEGER lpNetResource, INTEGER @lphEnum DECLARE INTEGER WNetCloseEnum IN mpr INTEGER hEnum DECLARE INTEGER WNetEnumResource IN mpr; INTEGER hEnum, INTEGER @lpcCount, STRING @lpBuffer,; INTEGER @lpBufferSize FUNCTION buf2dword (lcBuffer) RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ; BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +; BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +; BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24) FUNCTION mem2str(lnMemBlock) #DEFINE BUFFER_SIZE 16 #DEFINE EMPTY_BUFFER Repli(Chr(0), BUFFER_SIZE) IF lnMemBlock = 0 RETURN "" ENDIF DECLARE RtlMoveMemory IN kernel32 As Heap2Str; STRING @, INTEGER, INTEGER LOCAL lnPtr, lcResult, lcBuffer, lnPos lnPtr = lnMemBlock lcResult = "" DO WHILE .T. lcBuffer = EMPTY_BUFFER = Heap2Str (@lcBuffer, lnPtr, BUFFER_SIZE) lnPos = AT(Chr(0), lcBuffer) IF lnPos > 0 lcResult = lcResult + SUBSTR(lcBuffer, 1, lnPos-1) RETURN lcResult ELSE lcResult = lcResult + lcBuffer lnPtr = lnPtr + BUFFER_SIZE ENDIF ENDDO