Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

LDB auslesen (LDBView)

Begonnen von Doming, Mai 20, 2025, 11:19:07

⏪ vorheriges - nächstes ⏩

Doming

Hallo,

mit folgender Funktion kann ich herausfinden, wer mit dem Backend verbunden war.

Public Function WhosOn(BEPfad As String) As String
On Error GoTo 0 'Err_WhosOn
Dim iLDBFile As Integer, iStart As Integer
Dim iLOF As Integer, i As Integer
Dim sPath As String, X As String
Dim sLogStr As String, sLogins As String
Dim sMach As String, sUser As String
Dim rUser As UserRec
Dim dbCurrent As Database
Set dbCurrent = DBEngine.Workspaces(0).Databases(0)
sPath = dbCurrent.Name
dbCurrent.Close

   X = Dir(BEPfad)
   iStart = 1
   iLDBFile = FreeFile
   Open BEPfad For Binary Access Read Shared As iLDBFile
   iLOF = LOF(iLDBFile)
   Do While Not EOF(iLDBFile)
      Get iLDBFile, , rUser
      With rUser
         i = 1
         sMach = ""
         While .bMach(i) <> 0
            sMach = sMach & Chr(.bMach(i))
            i = i + 1
         Wend
         i = 1
         sUser = ""
         While .bUser(i) <> 0
            sUser = sUser & Chr(.bUser(i))
            i = i + 1
         Wend
      End With
      sLogStr = sMach
      If InStr(sLogins, sLogStr) = 0 Then
 '        sLogins = sLogins & WerTippt(sLogStr) & vbCrLf '"; "
         sLogins = sLogins & sLogStr & "; "
      End If
      iStart = iStart + 64
   Loop
   Close iLDBFile
   WhosOn = sLogins

   Set dbCurrent = Nothing
Exit_WhosOn:
   Exit Function
Err_WhosOn:
   If Err = 68 Then
      MsgBox "Ich finde keine LDB-Liste", 48, "No LDB File"
   Else
      MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
      Close iLDBFile
   End If
   Resume Exit_WhosOn
End Function

Ich vermute, dass die LDBview.exe ähnlich funktioniert. Allerdings kann sie noch etwas weiteres:
Sie dürfen in diesem Board keine Dateianhänge sehen.

Von den 3 Einträgen ist der letzte offenbar nicht mehr aktiv eingeloggt. Ich kann also sehen, dass ich zwei Leute kontaktieren muss, wenn ich exklusiven Zugriff auf die DB haben will.

Kann ich das auch mit VBA herausfinden?

Gruß
 Doming

Beaker s.a.

Hallo Doming,
Kann dir zwar hier deine Frage nicht beantworten, aber mir ist da Folgendes aufgefallen.
Wozu erstellst du eine Referenz auf "CurrentDb", nur um den Pfad auszulesen. Da reicht
doch ein direkter Zugriff auf CurrentDb
sPath = CurrentDb.NameUnd wenn schon eine Referenz, dann besser so
Private m_dbCurrent As DAO.Database

Public Property Get dbCurrent() As DAO.Database
'---------------------------------------------------------------------------------------
' Autor     : Hab' ich mal wieder vergessen; schätze aber Lebans oder Kreft
' Purpose   : Why is this the "CurrentDbC" property proc best? Because it is the
'             most generic and handles the most issues and problems. After all, a
'             global can be erased if someone hits the code reset button in VBE.
'             DBEngine(0)(0) might not be the current db. CurrentDb is expensive if
'             called repeatedly. And so on.
'---------------------------------------------------------------------------------------
   
    If (m_dbCurrent Is Nothing) Then
        Set m_dbCurrent = CurrentDb
    End If

    Set dbCurrent = m_dbCurrent

Ende_CleanUp:
    On Error Resume Next
    Exit Property

End Property

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Doming

Hmpf, hat man mich wieder erwischt, habe das Ding aus einer alten DB rauskopiert ohne alles durchzugehen.
Ursprünglich war die Funktion statisch programmiert, ich habe erst vorhin den BEPfad eingefügt.
Es funktioniert auch so:Public Function WhosOn(BEPfad As String) As String
On Error GoTo Err_WhosOn
Dim iLDBFile As Long, iStart As Long
Dim iLOF As Long, i As Long
Dim X As String
Dim sLogStr As String, sLogins As String
Dim sMach As String, sUser As String
Dim rUser As UserRec
   
   X = Dir(BEPfad)
   iStart = 1
   iLDBFile = FreeFile
   Open BEPfad For Binary Access Read Shared As iLDBFile
   iLOF = LOF(iLDBFile)
   Do While Not EOF(iLDBFile)
      Get iLDBFile, , rUser
      With rUser
         i = 1
         sMach = ""
         While .bMach(i) <> 0
            sMach = sMach & Chr(.bMach(i))
            i = i + 1
         Wend
         i = 1
         sUser = ""
         While .bUser(i) <> 0
            sUser = sUser & Chr(.bUser(i))
            i = i + 1
         Wend
      End With
      sLogStr = sMach
      If InStr(sLogins, sLogStr) = 0 Then
         sLogins = sLogins & sLogStr & "; "
      End If
      iStart = iStart + 64
   Loop
   Close iLDBFile
   WhosOn = sLogins

Exit_WhosOn:
   Exit Function
Err_WhosOn:
   If Err = 68 Then
      MsgBox "Ich finde keine LDB-Liste", 48, "No LDB File"
   Else
      MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
      Close iLDBFile
   End If
   Resume Exit_WhosOn
End Function

Knobbi38

#3
Hallo,

wofür soll das gut sein? Seit die Benutzerverwaltung in .accdb Datenbanken  nicht mehr zur Verfügung steht, bringt die Information gar nichts mehr, da als "Anmeldename" immer "Admin" verwendet wird ( kann man auch schnell mit einem Texteditor überprüfen).

Man könnte allerdings noch die Informationen dahingehend auswerten, von welchem PC die Datei aktuell noch gelockt wird. Das ist ein wenig aufwendiger und lässt aber noch keinen Rückschluss auf den Benutzer zu:
https://www.vbforums.com/showthread.php?851223-LDB-Viewer
Ein Schritt weiter wäre dann, zu ermitteln, von welchem PC welcher Benutzer aktuell auf die Datei zugreift.
So etwas geht mit Windows Bordmitteln:
https://www.manageengine.de/produkte-loesungen/active-directory/adaudit-plus/infomaterial/ad-tipp-datei-und-ordnerzugriffe-ueberwachen.htmloder aber mit Tools aus den Powertoys:
https://www.windows-faq.de/2022/11/13/wer-hat-diese-datei-im-zugriff/
Das funktioniert allerdings wahrscheinlich nur, wenn man an dem PC/Server arbeitet, auf dem die *.laccdb" angelegt ist. So etwas vom Client aus zu ermitteln, dürfte nicht ganz einfach sein.

Gruß Knobbi38

Doming

Moin Knobbi,

ich habe mir die Vorschläge mal angesehen.
Der Code von dem Thierry fliegt mir gleich um die Ohren ("Microsoft Access funktioniert nicht mehr"), mit dem vom dilettante kann ich nichts anfangen und die weiteren Links scheitern an meinen nicht vorhandenen Adminrechten.

Hätte nicht gedacht, dass das so eine Raketentechnik ist (weil siehe LDBViewer)

Gruß
 Doming

MzKlMu

Hallo,
wenn man keine passende MDW Datei zur Datenbank hat, ist das Auslesen der LDB sinnlos. Auch mit einem entsprechenden Viewer.
Man kann allenfalls feststellen, dass noch jemand die DB geöffnet hat, aber nicht wer.
Siehe auch 1.Absatz in #3
Gruß Klaus

Doming

Hallo,
ich habe gerade diese Datenbank im Netz gefunden. Offenbar hat sich der Colin ebenfalls mit dem Problem beschäftigt.
Auch wenn dort Admin als User ausgegeben wird, mit dem Computernamen kann man auch schon gut was anfangen (was andere hat LDBView ja auch nicht ausgegeben).

Knobbi38

Hallo Domin,

die Datenbank ist jetzt nicht so das Highlight, aber immerhin findest du die Idee von Dilettante mit der ADO-Schema Abfrage und UserRoster umgesetzt, die halt genau das angezeigt, was in der .laccdb auch drin steht.

Der Code von Thierry funktioniert übrigens sehr gut und als Bonus wird noch dir IP Adresse ermittelt. Mit der Funktion LockFile() wird dann indirekt ermittel, ob der Benutzer noch eingeloggt ist oder nicht. Wenn bei dir der Code nicht funktioniert, sollte es also noch andere Gründe dafür geben, aber ohne Adminrechte kann man mit diesen Tools eh nicht viel anfangen.

Gruß Knobbi38