Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[vba/acces] Bepalen of een host online is*

Pagina: 1
Acties:

  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Hallo,

Ik heb een probleem met een [gebeurtenisprocedure] in Access 2007 (zie onderstaande code)

Het lukt niet om een veld waarde in Access 2007 (ipadres) uit een database te halen en dit achter het commando ping te plakken.

Het uitvoeren van het commanda ping is ondertussen gelukt! Alleen het ophalen van het ip-adres uit de database lukt nog niet helemaal (of helemaal niet). Het gaat waarschijnlijk verkeerd bij het toewijzen van de variable van het ip-adres uit de database (veld is --> Ip-Adres) het is een kaal formulier en het ipadres wordt hier netjes op weergegeven. Nu is mijn vraag wie kan mij verder helpen, of heeft een voorbeeld hiervoor. Ik wil er natuurlijk wel iets van leren.

--------------------------------------------------------------------------------------------------------
Private Sub Knop226_Click()
Dim IP As String
Dim frm As Form
Set frm = "5 Computerformuliergegevens Totaal"
IP = "Componenten.Ip-Adres"

MsgBox "Hello" & IP & "Hello 2"
Call Shell(Environ$("COMSPEC") & " /c c:\windows\system32\ping.exe IP", vbNormalFocus)

End Sub
--------------------------------------------------------------------------------------------------------
Extra informatie
Tabel naam = Componenten
Veldnaam = Ip-Adres

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 15-10 13:46
Ik begrijp helemaal niet wat je bedoelt.

Als je je formpje baseert op een record(set), zoals een query of een tabel, met daarin het veld IP-adres, dan kan je toch:

me![IP-adres]

gebruiken in je programmacode? (zonder " uiteraard, anders is het gewoon een tekstje.
je hoeft dan ook de variable IP niet de dimensioneren.

Ik zou wel even, voordat je ping uitvoert controleren of het uberhaupt een geldig IP-adres is, bijvoorbeeld met:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Function IsValidIPAddress(ByVal strIPAddress As Variant) As Boolean
    On Error GoTo Handler
    Dim varAddress As Variant, n As Long, lCount As Long
    varAddress = Split(strIPAddress, ".", , vbTextCompare)
    If IsArray(varAddress) Then
        For n = LBound(varAddress) To UBound(varAddress)
            lCount = lCount + 1
            varAddress(n) = CByte(varAddress(n))
        Next
        IsValidIPAddress = (lCount = 4)
    End If
Handler:
End Function

[ Voor 57% gewijzigd door Witte op 15-08-2008 16:31 ]

Houdoe


  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Bedankt voor de snelle reactie! Ik krijg nu inderdaad in mijn msgbox het ipadres te zien :) alleen in de dosbox krijg ik niets te zien (de box verschijnt en verdwijnt direct weer) Het lijkt erop als of Access de VBA variabele niet goed herkend (of doorgeeft aan de dosbox). Moet ik deze variabele soms als een soort globale variabele definiëren ergens in Access..?

Het werkt ook overigens niet met haakjes......de onderstaande 4 regels heb ik zelf al geprobeerd maar dat werkt helaas niet....
Call Shell(Environ$("COMSPEC") & " /c c:\windows\system32\ping.exe "Me![IP-adres]""
Call Shell(Environ$("COMSPEC") & " /c c:\windows\system32\ping.exe 'Me![IP-adres]'"
Call Shell(Environ$("COMSPEC") & " /c c:\windows\system32\ping.exe ,'Me![IP-adres]'"
Call Shell(Environ$("COMSPEC") & " /c c:\windows\system32\ping.exe & Me![IP-adres]"


Dit is mijn huidige code
-----------------------------------------
Private Sub Knop276_Click()

MsgBox "Hello " & Me![IP-adres] & " Hello 2"
Call Shell(Environ$("COMSPEC") & " /c c:\windows\system32\ping.exe Me![IP-adres]", vbNormalFocus)
End Sub

[ Voor 8% gewijzigd door wigwam op 15-08-2008 17:46 ]


  • Witte
  • Registratie: Februari 2000
  • Laatst online: 15-10 13:46
en zo:
Call Shell(Environ$("COMSPEC") & " /c c:\windows\system32\ping.exe " & Me![IP-adres], vbNormalFocus)

het lijkt erop dat je string operaties niet helemaal begrijpt. Als je een veldnaam of variabele tussen " zet, is het een tekstje, en niet een veld of waarde.

[ Voor 49% gewijzigd door Witte op 16-08-2008 07:18 ]

Houdoe


  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Bedankt! Het waren inderdaad de irritante " " Het gaat inderdaad nog wel eens niet helemaal goed met de " "

Ik heb de code ondertussen iets aangepast (zie onderstaande code --> misschien ook wel makkelijk voor andere mensen)

De code controleert nu ook of de categorie wel een computer is en past dan ook de kleur aan (vakje online wordt groen of rood, op het formulier) en stuurt dan ook een berichtje naar de gebruiker :) Ik gebruik verschillende categorieën in mijn database, vandaar.

Alleen weet jij of het ook mogelijk is om de status van het commando ping te controleren Zodat een vakje op het formulier bij een time-out bijvoorbeeld rood wordt en bij een Antwoord van een ping groen wordt.

Is het mogelijk om waarden vanuit een dosbox te kopiëren/over te nemen naar een Access database? bijvoorbeeld van een nslookup het bijbehorende IP-adres..?

Private Sub Computernaampingen_Click()
If [Componenten.Categorie] = "Computer" Then
Call Shell(Environ$("COMSPEC") & " /c C:\Windows\System32\cmd.exe /K | c:\windows\system32\ping.exe -a " & Me![Systeem-id], vbNormalFocus)vbNormalFocus)
[online].BackColor = RGB(204, 255, 204)
[online].[Visible] = True
Else
[Componenten.Categorie] = ""
[online].BackColor = RGB(100, 0, 0)
[online].[Visible] = True
MsgBox "Deze categorie heeft geen IP-adres"
End If
End Sub

[ Voor 1% gewijzigd door wigwam op 18-08-2008 09:45 . Reden: Dosbox blijft nu ook mooi open ]


  • Witte
  • Registratie: Februari 2000
  • Laatst online: 15-10 13:46
Het is wel handig als je code tussen [code]-tags zet, dat verhoogt de leesbaarheid enorm.

Je kan de output van een doscommando opvangen door > file.txt erachter te zetten (in jouw geval & "> file.txt"), vervolgens controleer je of in dit textfiletje je dingen tegenkomt die je wil zien (bijvoorbeeld het percentage verlies van pakketten). Een textfiletje inlezen is erg eenvoudig in Access.

Een nadeel van deze methode, is dat Access de dosbox start in een aparte thread, en niet weet wat de status van deze thread is en dus wanneer dit dosboxje klaar is met zijn taak en het tekstfiletje in te lezen is. Je moet Access dus
1. een paar seconden laten wachten tot een dosboxje klaar is
2. in de gaten laten houden of het dosboxje klaar is. Dit is redelijk ingewikkeld, en je zal met WinAPI aan de slag moeten. Hier en hier vind je daar iets over.

[ Voor 46% gewijzigd door Witte op 19-08-2008 09:55 ]

Houdoe


  • thomrob
  • Registratie: Maart 2001
  • Laatst online: 28-03-2024

thomrob

allround developer

waarom een dosbox gebruiken? Dit kun je m.i. ook zelf 'simuleren' met behulp van winsock. Als je niet weet wat sockets zijn is het wellicht lastig, maar dat is het gebruik van een dosbox ook.

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 15-10 13:46
Het is dan wel handig wanneer je iets meer van je oplossing prijsgeeft, iets meer over het gebruik van winsocks, ipv alleen maar melden dat dat ook kan.
TS zit met een database met computers en (ik hoop) vaste ip-adressen Hij wil (in een formpje) controleren of het ip-adres 'ping'-baar is, en de status daarvan waarschijnlijk terug opslaan in de database of op het scherm in een dialoogvenster tonen.
Mijn oplossing borduurt voort op de door TS ingeslagen weg, namelijk met een shell / dosboxje. Er zullen veel meer wegen zijn die naar Rome leiden.

[ Voor 55% gewijzigd door Witte op 21-08-2008 08:57 ]

Houdoe


  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Ik ben ondertussen zover dat ik een box heb in mijn database-formulier die het ip-adres pingt en aangeeft of de host online of offline is (rood offline - groen online)

Het is overigens een dirty-stukje-code geworden :)

Ik krijg het alleen niet voor elkaar om de het ipadres vanuit het stukje code (of met behulp van een dos-commando) over te zetten naar mijn eigen database. De pogingen hiervan heb ik in de onderstaande code maar weglaten (pogingen met het commando type voor het uitlezen van een textbestand werkt niet ..... :'( krijg alleen maar een getal terug en geen text.....

Nu was mijn vraag heeft iemand inderdaad iets meer info (het liefst een werkend voorbeeld met behulp van een gebeurtenis event vanuit Access) over de "winsock" mogelijkheid....


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Private Sub Knop237_Click()
On Error GoTo ErrorHandler

    Dim strSearch As String
    Dim strComputer As String
    Dim objPing As Object
    Dim objStatus As Object
    Dim PingSilent As String

            [online2] = "Bezig met ophalen"
            [online2].BackColor = RGB(255, 255, 255)
            strComputer = Me![IP-adres]
            Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_PingStatus where address = '" & strComputer & "'")
For Each objStatus In objPing
        If IsNull(objStatus.StatusCode) Or objStatus.StatusCode <> 0 Then
        PingSilent = 0
                [online2] = ""
                [online2].BackColor = RGB(255, 255, 255)
                [online2].BackColor = RGB(255, 0, 0)
                [online2].[Visible] = True
    Else
                PingSilent = 1
                [online2] = ""
                [online2].BackColor = RGB(255, 255, 255)
                [online2].BackColor = RGB(14, 254, 32)
                [online2].[Visible] = True
    End If
    Next

ErrorHandlerExit:
   Exit Sub

ErrorHandler:
   MsgBox "Error No: " & err.Number & "; Description: " & _
      err.Description
   Resume ErrorHandlerExit
End Sub

[ Voor 12% gewijzigd door wigwam op 22-08-2008 17:40 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Je hebt het IP adres toch al? Waarom zou je het opnieuw uit je dos box/winsock/wmi query willen opvissen?
wigwam schreef op vrijdag 22 augustus 2008 @ 17:34:
Nu is mijn vraag wie kan mij verder helpen, of heeft een voorbeeld hiervoor. Ik wil er natuurlijk wel iets van leren.

Nu was mijn vraag heeft iemand inderdaad iets meer info (het liefst een werkend voorbeeld met behulp van een gebeurtenis event vanuit Access) over de "winsock" mogelijkheid....
Twijfel, twijfel ;)

[ Voor 68% gewijzigd door Lustucru op 22-08-2008 19:01 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 29-11 23:42
Kun je niet gebruik maken van een api: http://www.ex-designz.net/apicat.asp?apicat=30

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Die api doet wat anders en crashed in o2k3.
Deze lijkt wel te werken: http://vbnet.mvps.org/index.html?code/internet/ping.htm

[ Voor 11% gewijzigd door Lustucru op 23-08-2008 10:55 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Lustucru schreef op vrijdag 22 augustus 2008 @ 18:57:
Je hebt het IP adres toch al? Waarom zou je het opnieuw uit je dos box/winsock/wmi query willen opvissen?
Wat is eigenlijk probeerde te zeggen was dat ik met behulp van de computernaam (systeem-id in het onderstaande stukje code) het ipadres in de database wil laten wijzigen. Het systeem-id in mijn database zal nooit meer wijzigen maar bij het ip-adres zal dit niet altijd het geval zijn

code:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Computernaampingen_Click()
If [Componenten.Categorie] = "Computer" Then
[b]Call Shell(Environ$("COMSPEC") & " /c C:\Windows\System32\cmd.exe /K | c:\windows\system32\ping.exe -a " & Me![Systeem-id], vbNormalFocus)vbNormalFocus)[/b]
[online].BackColor = RGB(204, 255, 204)
[online].[Visible] = True
Else
[Componenten.Categorie] = ""
[online].BackColor = RGB(100, 0, 0)
[online].[Visible] = True
MsgBox "Deze categorie heeft geen IP-adres"
End If
End Sub

[ Voor 83% gewijzigd door wigwam op 23-08-2008 16:32 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Op de site die ik je gaf vind je routines voor ongeveer alles en nog wat wat je nodig hebt. Dus ook resolving van hostnamen naar Ip adressen, pingen op hostnaam etc etc. Met voorbeelden en al.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Lustucru schreef op zaterdag 23 augustus 2008 @ 16:41:
Op de site die ik je gaf vind je routines voor ongeveer alles en nog wat wat je nodig hebt. Dus ook resolving van hostnamen naar Ip adressen, pingen op hostnaam etc etc. Met voorbeelden en al.
Ik gaat er maandag naar kijken! alvast bedankt!

Verwijderd

je was goed op weg met de wmi scripting code in http://gathering.tweakers.net/forum/quote_message/30620930/0
dit valt eenvoudig aan te passen om de hostnaam om te zetten naar een ip-adres. dit voorbeeld gebruikt expliciete variabelentypes en vereist bijgevolg een verwijzing naar microsoft wmi scripting library. foutafhandelingscode enz. door jezelf toe te voegen uiteraard. ;)
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub HostNaam_naar_IPAdres()
  Dim WbemScriptingObject As WbemScripting.SWbemServices
  Dim WMIPing             As WbemScripting.SWbemObjectSet
  Dim WMIIPAdres          As WbemScripting.SWbemObject
  
  Set WbemScriptingObject = GetObject("winmgmts:\\.\root\cimv2")
  Set WMIPing = _
      WbemScriptingObject.ExecQuery _
        ( _
          "SELECT ProtocolAddress " & _
          "FROM Win32_PingStatus " & _
          "WHERE Address = '" & hostnaamvariabelemetwaardeuitaccess & "'" _
          , , WbemScripting.wbemFlagForwardOnly _
        )
  For Each WMIIPAdres In WMIPing
    Debug.Print WMIIPAdres.ProtocolAddress'dit is het ip-adres, dit kan je terug in de db plaatsen
  Next
End Sub
hint: bij het debuggen kan venster->locale variabelen goede tips geven.

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 15-10 13:46
Ik kwam dit stukje code tegen (een functie die HostOnline heet, en als returncode teruggeeft of een host online is ja of nee), werkt erg goed, en maakt gebruik van WMI.

code:
1
2
3
4
5
6
7
8
9
10
Function HostOnline(strComputer) As Boolean
Dim objPing
Dim objStatus
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_PingStatus where address = '" & strComputer & "'")
            
For Each objStatus In objPing
  HostOnline = Nz(objStatus.StatusCode, -1) = 0  
Next

End Function


En hier vind je nog wat uitleg.

[ Voor 12% gewijzigd door Witte op 27-08-2008 10:42 ]

Houdoe


  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Bedankt voor de voorbeeld code

Ik heb de code iets aangepast (mijn eigen variable er in gezet enzovoorts)

Ik heb een button aangemaakt in Access en de onderstaande code er aangelinkt alleen er gebeurt helemaal niets...Zelfs geen (wazige) foutmelding >:) Of mag ik geen WMI code direct aan een button linken [gebeurtenisevent]

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Computernaampingen_Click()
  Dim WbemScriptingObject As WbemScripting.SWbemServices
  Dim WMIPing             As WbemScripting.SWbemObjectSet
  Dim WMIIPAdres          As WbemScripting.SWbemObject
   
  Set WbemScriptingObject = GetObject("winmgmts:\\.\root\cimv2")
  Set WMIPing = _
      WbemScriptingObject.ExecQuery _
        ( _
    [b]      "SELECT ProtocolAddress " & "FROM Win32_PingStatus " & "WHERE Address = '" & Me![Systeem-id] & "'", , WbemScripting.wbemFlagForwardOnly) [/b]
  For Each WMIIPAdres In WMIPing
    'Debug.Print WMIIPAdres.ProtocolAddress 'dit is het ip-adres, dit kan je terug in de db plaatsen
[b]  WMIIPAdres.ProtocolAddress = Me![IP-adres].Value  [/b]
    Next
End Sub

Verwijderd

wigwam schreef op woensdag 27 augustus 2008 @ 15:59:
WMIIPAdres.ProtocolAddress = Me![IP-adres].Value
het is de bedoeling dat je het bekomen ipadres in het (formulier)veld opslaat, dus dat moet andersom ;)

  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Verwijderd schreef op donderdag 28 augustus 2008 @ 11:45:
[...]
het is de bedoeling dat je het bekomen ipadres in het (formulier)veld opslaat, dus dat moet andersom ;)
Nee toch....De waarde van WMIIPAdres.ProtocolAddress moet worden toegekend aan Me![IP-adres].. dan staat het toch goed..? of niet

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 15-10 13:46
wigwam schreef op donderdag 28 augustus 2008 @ 15:34:
[...]


Nee toch....De waarde van WMIIPAdres.ProtocolAddress moet worden toegekend aan Me![IP-adres].. dan staat het toch goed..? of niet
Nee!

Als je zegt
A = 3
dan ken je aan variabele A de waarde 3 toe, toch?


Ik zou zoiets doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub Computernaampingen_Click()
msgbox "Het IP-adres = " & Host2IP (Me![Systeem-id])
End Sub


Function Host2IP(strComputer) As String
Dim objPing
Dim objStatus
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_PingStatus where address = '" & strComputer & "'")

Host2IP = ""            
For Each objStatus In objPing
  If Nz(objStatus.StatusCode, -1) = 0 Then Host2IP = objStatus.ProtocolAddress
Next

End Function

[ Voor 62% gewijzigd door Witte op 28-08-2008 15:58 ]

Houdoe


  • wigwam
  • Registratie: Oktober 2001
  • Laatst online: 18-11 16:34
Het werkt (bijna) perfect! :P

IP-adressen ophalen van Windows 2000/XP machines werkt echt super! Alleen bij Vista/2008 machines haalt de functie alleen het ip versie 6 adres op (voorbeeld --> ::1).

Is er nog een mogelijkheid om in de functie aan te geven dat het alleen maar moet controleren op
ip-versie-4-adressen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private ping_Click()
[IP-adres] = Host2IP(Me![Systeem-id])
End Sub

Function Host2IP(strComputer) As String
Dim objPing
Dim objStatus
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_PingStatus where address = '" & strComputer & "'")

Host2IP = ""
For Each objStatus In objPing
  If Nz(objStatus.StatusCode, -1) = 0 Then Host2IP = objStatus.ProtocolAddress
Next

End Function

  • Witte
  • Registratie: Februari 2000
  • Laatst online: 15-10 13:46
Dit zal je even op Microsoft TechNet of MSDN moeten opsporen, wat de property van IPv4 is.

Is wel lastig, want dan moet je vooraf dus weten wat het platform is waarop de functie draait, want blijkbaar geeft de property ProtocollAddress op verschillende platforms een verschillende eigenschap (IPv6 vs IPv4)

Je kan natuurlijk ook even een functietje maken dat een IPv6 adres naar een IPv4 adres converteert: de laatste 4 bytes van het IPv6 adres is het IPv4 adres op het (lokale) netwerk:

Afbeeldingslocatie: http://ipconvert.deserthail.qarchive.org/mainscreen350.png

[ Voor 29% gewijzigd door Witte op 29-08-2008 10:09 ]

Houdoe

Pagina: 1