Remote Windows-Version per API

  • Ich habe folgendes Script, um die Windows-Version eines entfernten Systems zu ermitteln.
    Hatte eigentlich gehofft, damit die Major & Minor-Version zurückzubekommen. Aber irgendwo hat sich mal wieder ein Fehler eingeschlichen. Die schwierigen DllCall's. Kann mir jemand erklären was ich flasch gemacht habe ?

    Spoiler anzeigen
    [autoit]

    _NetWkstaGetInfo("\\Servername")

    [/autoit] [autoit][/autoit] [autoit]

    Func _NetWkstaGetInfo($sServer)
    Local $sBuffer = DllStructCreate("dword;ptr;ptr;dword;dword")
    Local $return = DllCall("netapi32.dll","int","NetWkstaGetInfo", _
    "wstr",$sServer, _
    "int",100, _
    "ptr",DllStructGetPtr($sBuffer))
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetWkstaGetInfo'")
    Else
    MsgBox(0,"Ausgabe",DllStructGetData($sbuffer,4))
    EndIf

    $return = DllCall("netapi32.dll","int","NetApiBufferFree", _
    "ptr",DllStructGetPtr($sBuffer))
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetApiBufferFree'")
    EndIf
    EndFunc

    [/autoit]

    Besten Dank
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (8. November 2008 um 14:14)

  • Der Buffer wird von der DLL erzeugt, du musst die struct aus demPointer erstellen:

    Spoiler anzeigen
    [autoit]

    _NetWkstaGetInfo("\\"&@ComputerName)

    [/autoit] [autoit][/autoit] [autoit]

    Func _NetWkstaGetInfo($sServer)
    Local $_WKSTA_INFO_100 = "dword;ptr;ptr;dword;dword"
    Local $return = DllCall("netapi32.dll","int","NetWkstaGetInfo", _
    "wstr",$sServer, _
    "int",100, _
    "ptr*",0)
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetWkstaGetInfo'")
    Else
    $sBuffer = DllStructCreate($_WKSTA_INFO_100,$return[3])
    MsgBox(0,"Ausgabe",DllStructGetData($sbuffer,4))
    EndIf

    $return = DllCall("netapi32.dll","int","NetApiBufferFree", _
    "ptr",DllStructGetPtr($sBuffer))
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetApiBufferFree'")
    EndIf
    EndFunc

    [/autoit]
  • Danke für den Tip, man lernt scheinbar nie aus, jedenfalls nicht wenn man DllCall's nutzen will. Ich habe jetzt schon einige Deiner Tips beherzigt und es klappt größtenteils auch schon ganz gut. Nun stehe ich aber wieder vor dem Problem, das ich den String nicht ermitteln kann, auf den die beiden Pointer (Computername & Langroup) zeigen. Kann mir nochmal jemand einen Tip geben ?

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsDeclared ("Const $PLATFORM_ID_DOS") Then Const $PLATFORM_ID_DOS = 300
    If Not IsDeclared ("Const $PLATFORM_ID_OS2") Then Const $PLATFORM_ID_OS2 = 400
    If Not IsDeclared ("Const $PLATFORM_ID_NT") Then Const $PLATFORM_ID_NT = 500
    If Not IsDeclared ("Const $PLATFORM_ID_OSF") Then Const $PLATFORM_ID_OSF = 600
    If Not IsDeclared ("Const $PLATFORM_ID_VMS") Then Const $PLATFORM_ID_VMS = 700

    [/autoit] [autoit][/autoit] [autoit]

    Dim $array

    [/autoit] [autoit][/autoit] [autoit]

    $array = _NetWkstaGetInfo("\\"&@ComputerName)
    _ArrayDisplay($array)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _NetWkstaGetInfo($sServer)
    Local $daten [5], $sName
    Local $_WKSTA_INFO_100 = "dword;ptr;ptr;dword;dword"
    Local $return = DllCall("netapi32.dll","int","NetWkstaGetInfo", _
    "wstr",$sServer, _
    "int",100, _
    "ptr*",0)
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetWkstaGetInfo'")
    Else
    $sBuffer = DllStructCreate($_WKSTA_INFO_100,$return[3])
    Switch DllStructGetData($sbuffer,1)
    Case $PLATFORM_ID_DOS
    $daten[0] = "DOS"
    Case $PLATFORM_ID_OS2
    $daten[0] = "OS2"
    Case $PLATFORM_ID_NT
    $daten[0] = "NT"
    Case $PLATFORM_ID_OSF
    $daten[0] = "OSF"
    Case $PLATFORM_ID_VMS
    $daten[0] = "VMS"
    EndSwitch
    ; hier bekomme ich den String nicht...
    $daten[1] = DllStructGetData(DllStructCreate("str",DllStructGetData($sBuffer,2)),1)
    ;daten[2] kommt noch
    $daten[3] = DllStructGetData($sbuffer,4)
    $daten[4] = DllStructGetData($sbuffer,5)
    EndIf

    $return = DllCall("netapi32.dll","int","NetApiBufferFree", _
    "ptr",DllStructGetPtr($sBuffer))
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetApiBufferFree'")
    EndIf
    Return $daten
    EndFunc

    [/autoit]


    Gruß
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Dank der Hilfe, kann ich die Workstation-Informationen nun per WinApi auslesen.

    Ich will euch das fertige Script nicht vorenthalten...

    Spoiler anzeigen
    [autoit]


    ; Funktion '_NetWkstaGetInfo' von micha_he & Prog@ndy
    Func _NetWkstaGetInfo($sServer)
    ; Rückgabe:
    ; Array mit 5 Felder enthaelt: [0] = Platform_ID
    ; [1] = Computername
    ; [2] = Workgroup
    ; [3] = Major-Version
    ; [4] = Minor-Version
    If Not IsDeclared ("Const $PLATFORM_ID_DOS") Then Const $PLATFORM_ID_DOS = 300
    If Not IsDeclared ("Const $PLATFORM_ID_OS2") Then Const $PLATFORM_ID_OS2 = 400
    If Not IsDeclared ("Const $PLATFORM_ID_NT") Then Const $PLATFORM_ID_NT = 500
    If Not IsDeclared ("Const $PLATFORM_ID_OSF") Then Const $PLATFORM_ID_OSF = 600
    If Not IsDeclared ("Const $PLATFORM_ID_VMS") Then Const $PLATFORM_ID_VMS = 700
    Local $daten[5], $sName, $sBuffer, $return
    Local $_WKSTA_INFO_100 = "dword;ptr;ptr;dword;dword"
    While StringLeft($sServer,2) <> "\\"
    $sServer = "\" & $sServer
    Wend
    Local $return = DllCall("netapi32.dll","int","NetWkstaGetInfo", _
    "wstr",$sServer, _
    "int",100, _
    "ptr*",0)
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetWkstaGetInfo'")
    Else
    $sBuffer = DllStructCreate($_WKSTA_INFO_100,$return[3])
    Switch DllStructGetData($sbuffer,1)
    Case $PLATFORM_ID_DOS
    $daten[0] = "DOS"
    Case $PLATFORM_ID_OS2
    $daten[0] = "OS2"
    Case $PLATFORM_ID_NT
    $daten[0] = "NT"
    Case $PLATFORM_ID_OSF
    $daten[0] = "OSF"
    Case $PLATFORM_ID_VMS
    $daten[0] = "VMS"
    EndSwitch
    $daten[1] = _PtrStringRead(DllStructGetData($sBuffer,2),True)
    $daten[2] = _PtrStringRead(DllStructGetData($sBuffer,3),True)
    $daten[3] = DllStructGetData($sbuffer,4)
    $daten[4] = DllStructGetData($sbuffer,5)
    EndIf

    $return = DllCall("netapi32.dll","int","NetApiBufferFree", _
    "ptr",DllStructGetPtr($sBuffer))
    If $return[0] Then
    MsgBox(0,"Fehler","Fehler beim DllCall 'NetApiBufferFree'")
    EndIf
    Return $daten
    EndFunc ; Ende der Funktion '_NetWkstaGetInfo'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Prog@ndy
    Func _PtrStringLen($ptr,$IsUniCode=False)
    Local $UniCodeFunc=""
    If $IsUniCode Then $UniCodeFunc = "W"
    Local $ret = DllCall("kernel32.dll","int","lstrlen"&$UniCodeFunc,"ptr",$ptr)
    If @error Then Return SetError(1,0,-1)
    Return $ret[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Prog@ndy
    Func _PtrStringRead($ptr,$IsUniCode=False,$StringLen=-1)
    Local $UniCodeString=""
    If $IsUniCode Then $UniCodeString = "W"
    If $StringLen < 1 Then $StringLen = _PtrStringLen($ptr,$IsUniCode)
    If $StringLen < 1 Then Return SetError(1,0,"")
    Local $struct = DllStructCreate($UniCodeString&"char["&($StringLen+1)&"]",$ptr)
    Return DllStructGetData($struct,1)
    EndFunc

    [/autoit]

    Besten Dank
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"