# MS ACCESS XP Anmeldepasswort ändern



## Ralf Dillenburger (28. Juni 2004)

Hallo, hab mal wieder ein Problem mit Access:

Hab eine Datenbank auf einem Server liegen und im Netzwerk freigegeben. Da nur ein paar Benutzer Zugriff auf die Datenbank haben sollen, habe ich eine Arbeitsgruppeninformationsdatei für die Datenbank angelegt, die Benutzer erstellt und Passwörter vergeben. Jetzt meine Frage:

Kann ich (über VBA?) es irgendwie erreichen, dass ich zentral Passwörter für diese Konten vergeben kann? Ist nämlich etwas umständlich, sich mit jedem Account anzumelden, um das PW zu ändern...

Hat jemand ne Idee, wie ich aus VBA auf die Benutzerkonten zugreifen kann?

Danke

MfG

Ralf


----------



## Thomas Darimont (30. Juni 2004)

Hallo Herr Dillenburger!

(Da muss ein kleiner Hack her ;-) )

Schnapp dir die mdw Datei und bennene sie in mdb um. Dann kannst du sie ganz normal als Access Datenbankdatei öffnen. In der Tabellenübersicht siehst du zwar keine Tabellen, aber es gibt welche ;-)

Mit folgendem Code kannst du sie dir im Debug Fenster anzeigen lassen:


```
Option Compare Database
Option Explicit

Private Sub Befehl0_Click()

Dim cat As New ADOX.Catalog
Dim tbl As ADOX.Table

Dim rs As New ADODB.Recordset

With rs
    .ActiveConnection = CurrentProject.connection
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic
End With

cat.ActiveConnection = CurrentProject.connection

For Each tbl In cat.Tables
 Debug.Print tbl.Name
 rs.Open "select * from " & tbl.Name
 If Not rs.EOF And Not rs.BOF Then
    Debug.Print rs.GetString
 End If
 rs.Close
Next tbl

Set cat = Nothing
Set rs = Nothing


End Sub
```

Ich habe dazu die Verweise:
Mircosoft ActiveX Data Objects recordset 2.7 Library
und
Mircosoft ADO Ext. 2.7 for DDL and Security 
verwendet.

Wenn du das obige Beispiel ausführts ... einfach eine Form erzeugen und einen Button drauf legen und als Ereignisprozedur obigen Code hinterlegen.

Du erhälst darauf hin eine übersicht der internen Systemtabellen:



> MSysAccessObjects
> MSysAccounts
> MSysACEs
> MSysGroupList
> ...



Die interessante für dich ist wohl:
MSysACEs

Jedoch hast du darauf  jedoch von Haus aus keinen Zugriff (könnte sein, dass du Zugriff hast, wenn du dich als Admin anmeldest (Bin kein Admin) ;-) ).

Ansonsten liese sich diese kleine Hürde sicherlich mit noch einem kleinem Hack hinbiegen... ;-)

Kannst ja mal schauen, wie weit du kommst.

Gruß Tom


----------



## Thomas Darimont (30. Juni 2004)

Nachtrag:

Es geht sogar noch viiiiiiiiiiiiiiiiiiiiiiel einfacher:


```
'code wie oben 
'...
Dim user As ADOX.user

'....

For Each user In cat.Users
Debug.Print user.Name
user.ChangePassword "oldPassword", "newPassword" ' ;-)
Next user
```

Das Problem sollte sich nun erledigt haben ;-)

Gruß Tom


----------



## Thomas Darimont (30. Juni 2004)

Hallo!

Das Problem, was dabei nun auftritt ist das du das alte Passwort gar nicht kennst 

Das ist aber auch kein Thema, denn du willst ja alle Paswörter ändern.
Also gehst du einfach nur mit einer Schleife über die Users Auflistung und besorgst dir so erstmal alle Namen die du dir irgendwo (in einer Liste) zwischenspeicherst. Danahc löschst du alle User (Bis auf den gerade angemeldeten ;-) ) und 
machst folgendes für jeden User in der Liste:

(Beachte aber dabei, dass du dir auch noch die Berechtigungen merken musst ...
bzw. Die ID's die in der Berechtigungs-User-Zuordnungstabelle (findest du mit dem obigen Trick) die zu den "alten Usern gehören" müsstest du Updaten bzw. dir diese Merken und später wieder mit den "passenden" Usersätzen zusammenfügen ...  das wird glaub ich nicht so leicht.)


```
cat.Users.Append sUserName, "NeuesPasswort"
```


Jetzt sind wir aber wirklich (noch nicht ganz) fertig. ^^

Gruß tom


----------



## Ralf Dillenburger (30. Juni 2004)

Danke für die Tipps, Tom, habs auch hinbekommen (sogar noch einfacher; für meine Zwecke reicht es so):



```
Dim rsPW As Recordset
Dim strSQLPW As String
Dim dbPW As Database
Dim usrCurrent As User
Dim strAName As String

Set dbPW = DBEngine.Workspaces(0).Databases(0)
strSQLPW = "Select * from personal where pers_steu = true" 'Der ausgewählte Student wird in den RS aufgenommen
Set rsPW = dbPW.OpenRecordset(strSQLPW, DB_OPEN_DYNASET)
```
...

```
For Each usrCurrent In DBEngine.Workspaces(0).Users
                If usrCurrent.Name = rsPW!AName Then
                    usrCurrent.NewPassword strOldPW, strNewPW 'Ändert das Passwort des Benutzers
                    rsPW.Edit
                    rsPW!passwd = strNewPW  'Neues Passwort wird in die Datenbank geschrieben.
                    rsPW.Update
                    DoCmd.Close acForm, "ChangePW"
                End If
            Next usrCurrent
```

SO gehts auch; die Anmeldeinfos lege ich sowieso parallel in einer Tabelle ab.


----------

