Toon posts:

Windows user in Access - Database repareren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wij hebben hier een Access bestand die wordt gebruikt door +- 20 gebruikers. Nu heb ik laatst een wijziging gemaakt voor het inloggen, dat gaat nu namelijk aan de hand van de Windows gebruiker. [=Environ("username")]

Het gevolg hiervan is dat ik nu om de haverklap de database moet repareren, waarschijnlijk omdat de Access gebruiker (Currentuser) nu altijd "admin" is. Is er een manier om ervoor te zorgen dat de Currentuser altijd gelijk is aan de Windows user?

Iemand enig idee waarom ik steeds de database moet repareren sinds die wijziging? (klopt mijn redenering?)

Bedankt,

Verwijderd

Topicstarter
Niemand die hier iets over weet?

Verwijderd

Daarvoor dien je dus de Access beveiliging te gebruiken. Maak groepen en users aan en deel de users in. Geef de groepen de juiste rechten en verander het admin wachtwoord. Nu krijgt de gebruiker een schermpje van Access voor zijn giegeltje en 'weet' Access wie de CurrentUser is. Meer op MS site. Let vooral op het stuk met de mdw.

Waarom jij je db steeds moet repareren weet ik eerlijk gezegd niet. Wat zegt Access; Database is kapot of zo iets? Kan je iets meer zeggen over de reden waar Access mee aankomt.

Compacten helpt over het algemeen ook wel...

Verwijderd

Ik zou je ook aanraden om de data en de frontend in aparte databases te stoppen
data op het netwerk
frontend op de client

De data gaat dan minder vlug corrupt en als een frontend crashed dan kan de gebruiker deze simpel weer installen

Verwijderd

Topicstarter
Het is juist de bedoeling dat ik geen loginschermpje meer heb van Access. Hij moet als het ware de Currentuser aanpassen aan de Windows user. Is dit mogelijk met VBA? Wat ik dus eigenlijk wil bij het opstarten van het Acccess bestand is zoiets als:

Currentuser = Environ("username")
(zoals ik het hierboven zet werkt het natuurlijk niet, maar is even om aan te geven wat de bedoeling is.)

Ik denk namelijk dat de database telkens beschadigd raakt doordat er bijvoorbeeld 10X de Currentuser "admin" in het bestand dingen aan het invoeren zijn vanaf verschillende computers omdat ik zonder Access inlogscherm werk.

Iemand die me kan helpen?

Het gaat erom dat elke computer die het bestand opstart een andere currentuser krijgt, en niet standaard "admin".

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 01-04 13:18
IK twijfel er sterk aan of dit je probleem wel is hoor. Als je database zo vaak beschadigd raakt, zou ik je netwerk eens controleren of ze geen packetloss hebben.

Verwijderd

Je probleem ligt echt niet in het admin stukje. Om de naam van de gebruiker op te vragen zou je een API functie aan kunnen roepen.
Voor je database corruptie zou ik er eens aan denken om je data in een andere backend op te slaan. Zeker met 20 simultane gebruikers.

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Public Declare Function GetUserNameW Lib "advapi32.dll" (lpBuffer As Byte, nSize As Long) As Long
Public Declare Function NetUserGetGroups Lib "netapi32" (lpServer As Any, UserName As Byte, ByVal Level As Long, lpBuffer As Long, ByVal PrefMaxLen As Long, lpEntriesRead As Long, lpTotalEntries As Long) As Long

Public Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pTo As Any, uFrom As Any, ByVal lSize As Long)
Public Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
Public Declare Function lstrcpyW Lib "kernel32" (lpString1 As Byte, ByVal lpString2 As Long) As Long
Public Const NERR_Success As Long = 0&
Public Const UNLEN = 256         ' Maximum username length

Public Function CurrentUserName() As String
   Dim Buffer As String
   Dim yBuffer() As Byte
   Dim nRet As Long
   Dim nLen As Long
   Const NameLength = UNLEN + 1
   
   nLen = NameLength * 2
   ReDim yBuffer(0 To nLen - 1) As Byte
   If GetUserNameW(yBuffer(0), nLen) Then
      Buffer = yBuffer
      CurrentUserName = Left(Buffer, nLen - 1)
   End If
End Function


Private Function PointerToStringW(lpStringW As Long) As String
   Dim Buffer() As Byte
   Dim nLen As Long
   
   If lpStringW Then
      nLen = lstrlenW(lpStringW) * 2
      If nLen Then
         ReDim Buffer(0 To (nLen - 1)) As Byte
         CopyMem Buffer(0), ByVal lpStringW, nLen
         PointerToStringW = Buffer
      End If
   End If
End Function


Public Sub GroupNames(m_Groups() As String)

   Dim lpBuffer As Long
   Dim yUserName() As Byte
   Dim yServer() As Byte
   Dim lpGroups() As Long
   Dim nRead As Long
   Dim nTotal As Long
   Dim nRet As Long
   Dim i As Long
   
   yUserName = CurrentUserName() & vbNullChar
   yServer = "naam van je server" & vbNullChar
   
   nRet = NetUserGetGroups(yServer(0), yUserName(0), 0, lpBuffer, &H400, nRead, nTotal)
      
   If nRet = NERR_Success Then
      ReDim lpGroups(0 To nRead - 1) As Long
      ReDim m_Groups(0 To nRead - 1) As String
      CopyMem lpGroups(0), ByVal lpBuffer, nRead * 4
      For i = 0 To nRead - 1
         m_Groups(i) = PointerToStringW(lpGroups(i))
      Next i
   End If

End Sub

[ Voor 8% gewijzigd door Verwijderd op 24-04-2003 11:27 ]


Verwijderd

Topicstarter
Het probleem doet zich nu veel vaker voor nadat ik ben overgegaan naar Access zonder Access inlogscherm, maar via Windows user. Het enige wat ik dan kan bedenken is dat het toch iets met de admin te maken heeft.

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Verwijderd schreef op 24 April 2003 @ 09:40:
Je probleem ligt echt niet in het admin stukje. Om de naam van de gebruiker op te vragen zou je een API functie aan kunnen roepen.
Voor je database corruptie zou ik er eens aan denken om je data in een andere backend op te slaan. Zeker met 20 simultane gebruikers.

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
leuk stukje code....

Public Sub GroupNames(m_Groups() As String)

   Dim lpBuffer As Long
   Dim yUserName() As Byte
   Dim yServer() As Byte
   Dim lpGroups() As Long
   Dim nRead As Long
   Dim nTotal As Long
   Dim nRet As Long
   Dim i As Long
   
   yUserName = CurrentUserName() & vbNullChar
   yServer = "naam van je server" & vbNullChar
   
   nRet = NetUserGetGroups(yServer(0), yUserName(0), 0, lpBuffer, &H400, nRead, nTotal)
      
   If nRet = NERR_Success Then
      ReDim lpGroups(0 To nRead - 1) As Long
      ReDim m_Groups(0 To nRead - 1) As String
      CopyMem lpGroups(0), ByVal lpBuffer, nRead * 4
      For i = 0 To nRead - 1
         m_Groups(i) = PointerToStringW(lpGroups(i))
      Next i
   End If

End Sub
Wat geef je precies door met die m_groups?? Hoe moet je die servernaam invullen? Als UNC path (\\Server) of met gewoon path (C:\bla..)

Maar ik denk dat Supervisor eerder gelijk heeft...

Verwijderd

servernaam geef je gewoon door als UNC path
die onderste 2 functies zijn niet echt nodig.
m_groups geeft een array met de groepen terug van je NT domain.
Weet niet of het ook onder 2000 werkt.

Verwijderd

Ik laat in mijn database ook de current windows usernaam zoeken, ik heb een tabel met daarin alle werknemers van het bedrijf. Bij het opstarten wordt gekeken welke rechten in de DB deze persoon heeft a.d.h. van de usernaam en de tabel. Misschien dat dat nog iets voor je is?

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Verwijderd schreef op 24 April 2003 @ 10:53:
servernaam geef je gewoon door als UNC path
die onderste 2 functies zijn niet echt nodig.
m_groups geeft een array met de groepen terug van je NT domain.
Weet niet of het ook onder 2000 werkt.
eeeuh wat is de functie "CopyMem" in die code? Probeerde het net ff uit...

Verwijderd

Sorry, zie post met code, was een paar declares erbij te stoppen.

  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Verwijderd schreef op 24 april 2003 @ 11:36:
Sorry, zie post met code, was een paar declares erbij te stoppen.
Kijk daar hebben we wat aan.....
maar eeuh net wat uitgetest.. krijgt die toch "None" oftewel 0 elementen mee als m_group... op mijn eigen pc... mmm.. wat doe ik fout? \\server moet een unc path zijn naar een PDC\BDC zijn of zo?

Verwijderd

\\server moet wel een bdc of pdc zijn inderdaad.
Wat heb je draaien ?

Verwijderd

Dit werkt bij mij prima;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Declare Function apiGetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


Function fOSUserName() As String
Dim lngLen As Long, lngX As Long
Dim strUserName As String
    strUserName = String$(254, 0)
    lngLen = 255
    lngX = apiGetUserName(strUserName, lngLen)
    If lngX <> 0 Then
        fOSUserName = Left$(strUserName, lngLen - 1)
    Else
        fOSUserName = ""
    End If
End Function

[ Voor 8% gewijzigd door Verwijderd op 20-01-2005 13:53 ]

Pagina: 1