[VFP] Como obtener el nombre de las pc conectados a la red?

1,421 views
Skip to first unread message

ZeRoberto

unread,
Feb 22, 2013, 9:23:26 PM2/22/13
to publicesvfoxpro
Hola a todos, es posible obtener el nombre de todas las pc que están conectados a mi red? asi como sale en Mis Sitios de Red

Saludos

Daniel Sánchez

unread,
Feb 22, 2013, 11:21:48 PM2/22/13
to Comunidad de Visual Foxpro en Español
Buscando entre todos los archivos descargados encontre este código, veo que tiene codigo que inserta los ip obtenidos en una tabla con insert

CREATE CURSOR junk ( PCName c(30), ipaddress c(15))
LOCAL lcText, lcPCName, lcTextIP, lcExtractIP
Set Default To SYS(2023)
CLEAR
WAIT WINDOW "Processing IP Addresses in the network, please wait..." NOWAIT 
oWsh = Newobject('wscript.shell')
cmdDos = "CMD /c NET VIEW > CPUIP.txt"
oWsh.Run(cmdDos,0,.T.)
lcText = Filetostr("CPUIP.txt")
*Clear target first
Strtofile('',"PingResult.txt",0)

For lnVar = 1 To Occurs('\\',m.lcText)
lcPCName = Strextract(m.lcText,'\\',Space(1),lnVar)
WAIT WINDOW "Attempting to get IP address of "+lcPCName NOWAIT 
cmdDos = "CMD /c PING &lcPCName -n 1 > ping.txt"
oWsh.Run(cmdDos,0,.T.)
lcTextIP = Filetostr('ping.txt')
lcExtractIP = Strextract(m.lcTextIP,'[',']')
    lcExtractIP = Iif(Empty(lcExtractIP),"Unable to get",m.lcExtractIP)
* Strtofile(Padr(lcPCName,30)+lcExtractIP+Chr(13)+Chr(10),"PingResult.txt",1)
* thisform.edit1.Value = FILETOSTR("PingResult.txt")
INSERT INTO junk VALUES (m.lcPCName, m.lcExtractIP)
thisform.grid1.Refresh 
Endfor
WAIT CLEAR 



El 22 de febrero de 2013 21:23, ZeRoberto <zero...@gmail.com> escribió:
Hola a todos, es posible obtener el nombre de todas las pc que están conectados a mi red? asi como sale en Mis Sitios de Red

Saludos



--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Daniel Sánchez

unread,
Feb 22, 2013, 11:24:35 PM2/22/13
to Comunidad de Visual Foxpro en Español
Aquí encontré otro. Pruebas y nos comentas.

*!* *The code below (originally Ed's I believe) works in Windows NT, 2K,
*!* and XP, but not 95/98. How can this be done in Win 95/98?
*!*
*!* I need to retrieve a list of all computers on the network like
*!* the example below does for me and store them in the array Ausers:


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



El 22 de febrero de 2013 21:23, ZeRoberto <zero...@gmail.com> escribió:
Hola a todos, es posible obtener el nombre de todas las pc que están conectados a mi red? asi como sale en Mis Sitios de Red

Saludos

Daniel Sánchez

unread,
Feb 22, 2013, 11:51:05 PM2/22/13
to Comunidad de Visual Foxpro en Español
También encontré esta.

local laComputers(1), lnComputer

Anetresources(laComputers, Getenv("USERDOMAIN"), 1)

y Listo, en el arreglo lacomputers estarán las pcs de la red siempre y cuando tengan el mismo dominio que la tuya.



2013/2/22 Daniel Sánchez <resets...@gmail.com>

Luis Maria Guayan

unread,
Feb 23, 2013, 7:25:06 AM2/23/13
to publice...@googlegroups.com
Mira la función ANETRESOURCE() y mira un ejemplo de uso en este artículo de PortalFox

-- Utilizando la función ANETRESOURCES() --
http://www.portalfox.com/article.php?sid=2171


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 22/02/2013 23:23, ZeRoberto escribió:

ZeRoberto

unread,
Mar 4, 2013, 11:21:40 AM3/4/13
to publice...@googlegroups.com
Gracias Luis María ahora como obtengo el nombre del grupo de trabajo de mi pc

Saludos

ZeRoberto

unread,
Mar 4, 2013, 11:29:43 AM3/4/13
to publice...@googlegroups.com
Ya lo encontre Gracias

Set objWMISvc = GetObject( "winmgmts:\\.\root\cimv2" )
Set colItems = objWMISvc.ExecQuery( "Select * from Win32_ComputerSystem", ,48 )
For Each objItem in colItems
strComputerDomain = objItem.Domain
If objItem.PartOfDomain Then
WScript.Echo "Computer Domain: " & strComputerDomain
Else
WScript.Echo "Workgroup: " & strComputerDomain
End If
Next
Reply all
Reply to author
Forward
0 new messages