Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Zugriffsrechte auf Arbeitsblatt pro Benutzer | Herbers Excel-Forum


Betrifft: Zugriffsrechte auf Arbeitsblatt pro Benutzer von: Johannes K.
Geschrieben am: 19.12.2011 11:59:05

Hallo,

ich habe im Excel-Forumsarchiv einen Beitrag gefunden, wie man Arbeitsblätter pro Benutzer einschränken kann.

https://www.herber.de/forum/archiv/520to524/t523762.htm

Es geht mir für den VBA Code um eine Erweiterung, weil ich gerne einen Administrator festlegen würde, der auf alle Blätter zugreifen kann. Am besten auch einfach über seinen Netzwerkname (Environ). Der Code im Archiv wäre:

Private Sub Workbook_Open()
UN = Environ("UserName"#
If UN = "" Then US = "Unbekanner Na#e"
MsgBox "Ihr aktueller Anmeldena#e ist " & UN
End Sub

Private Sub Workbook_SheetActivate#ByVal Sh As Object#
    If ActiveSheet#Na#e = Sheets#1##Na#e Then Exit Sub
    If ActiveSheet#Na#e <> Environ#"UserNa#e"# Then
        x = MsgBox#"Sie haben keinen Zugriff auf dieses Tabellenblatt." & Chr#13# _
            & "Bitte wählen Sie IHR Blatt #" & Environ#"UserName"# & "# aus!", vbOKOnly, " _
Sicherheitshinweis")
        Sheets(1).Activate
    End If
End Sub
Über einen Tipp wäre ich sehr dankbar!

Mit freundlichen Grüßen und frohe Weihnachten

Johannes K.

  

Betrifft: Username Admin berechtigen von: NoNet
Geschrieben am: 19.12.2011 12:09:19

Hallo Johannes,

eine einfache Lösung wäre (im 2.Sub) :

  'mit UCASE() wird immer der Name in GROSSBUCHSTABEN überprüft !
 If UCase(ActiveSheet.Name) <> UCase(Environ("UserName")) and UCase(Environ("UserName"))<>"ADMIN" Then

Allerdings halte ich diesen "Lösungsansatz" für grundsätzlich mangelhaft :

- Wenn Makros beim Öffnen der Mappe deaktiviert werden, greift dieser Mechanismus nicht
- der "Username" lässt recht einfach ändern, da er nur in der Windows Umgebungsvariable "Username" gespeichert ist, aber nicht der tatsächliche Anmeldename abgefragt wird. Die Umgebungsvariable lässt sich recht einfach ändern (Windows Eingabeaufforderung : Set Username=Admin)

Gruß, NoNet


  

Betrifft: Set Username=Admin von: Reinhard
Geschrieben am: 19.12.2011 12:23:01

Hallo NoNet,

bist du sicher daß dies so einfach geht?

Sub tt()
Dim Dos
MsgBox Environ("UserName")
Dos = Shell("cmd /c set Username=Admin")
MsgBox Environ("UserName")
End Sub

Bei mir wird in der Box immer mein Username angezeigt und nicht Admin.

PS: Ich (Win XP) muß das bei der Eingabeaufforderung immer so schreiben
cmd /c set Username=Admin
Du nicht?

Gruß
Reinhard


  

Betrifft: AW: Set Username=Admin von: Johannes K.
Geschrieben am: 19.12.2011 12:40:51

Ich bin gerade noch auf der Suche nach dem Code, den ich in das 2. Sub kopieren muss. Wo wird denn abgefragt, welcher Username (als Beispiel einfach "klotz") alle Mappen einsehen können soll? Es geht mir dabei um eine Datei, in der jeder Mitarbeiter seine Stunden einträgt, aber nicht bei allen anderen einsehen können soll, wer schon wie viel Urlaub hatte etc. Deshalb die Beschränkung über die Netzwerkkennung. Das sich dieses sehr einfach umgehen lässt, wenn es jmd. will, war mir auch klar, aber es ist trotzdem eine nette Lösung. Ich müsste jetzt wie weiter oben geschrieben nur noch den Code so angepasst bekommen, das ein vorgegebener Benutzer alles einsehen kann ohne Beschränkungen, er quasi ausgeschlossen wird von dem Makro.

Danke schon einmal für eure Mühen.

PS:
Falls es wichtig werden sollte nutzen hier alle Win7 und Excel 2010.


  

Betrifft: Mappe nur mit aktivierten makros von: Reinhard
Geschrieben am: 19.12.2011 15:46:08

Hallo Johannes,

ohne jetzt ins Detail deiner Anfrage zu gehen.
Du mußt, damit dein Schutz durch Vba funktioniert die User zwingen die Mappe mit aktivierten Makros
zu öffnen.
Hier ist eine Beispiel:
http://hajo-excel.de/vba_nur_makros_allgemein.htm

Natürlich ist das kein Schutz gegen Kriminelle, Rudi und NoNet knacken den Schutz ruckzuck *schwergrins*
Im Ernst, wenn einer aus deiner Abteilung WILL dann schafft er es auch den Schutz zu umgehen und sich alle Blätter anzuschauen.
Letzlich ist Schutz in Excel so wie wenn du zeltest und den Zelteingangsreißverschluß mit
einem dicken Schloß von mir aus sogar von Abus sicherst. Jeder der in dein zelt will kommt rein.

Für Normaluser reicht der Schutz. Die Blätter die sie nicht sehen dürfen sind über Vba ausgeblendet und
nur mit reinem Excel können sie sie nicht einblenden lassen. Um sie einblenden zu lassen müßten sie
Vba laufen lassen, das können sie nicht, zumindest nicht in dieser mappe denn das Vba dieser mappe ist mit kennwort geschützt.

Zu deiner Anfrage, du kannst im Workbook_Open Ereigniscode u.a. entweder
1) eine Passwortabfrage einbauen, aber sehr lästig bei täglicher mehrmaliger Benutzung
2) wie hier über Environ den Windows-Usernamen abprüfen, dann bestimmte Blätter sichtbar machen
3) wie 2) aber den Excel-Usernamen

Mein Tipp, baue das von hajo in deine mappe ein, auch deinen vorhanden Code und die Tipps hier
und versuche das zum laufen zu bringen.
Wenn das nicht ganz klappt, mache eine Kopie der mappe, lösche alle Blätterinhalte, spielen hier wohl keine Rolee, und lade diese Mappe dann hier hoch mit genauer beschreibung was nicht klappt, bei Fehlermeldungen, welcher Fehler in welcher Codezeile.

Gruß
Reinhard








  

Betrifft: Doch, das stimmt... von: NoNet
Geschrieben am: 20.12.2011 14:35:22

Hallo Reinhard,

klaro : Per Shell aus VBA heraus muss man das mit cmd.exe /c aufrufen und diese Umgebungsvariable gilt dann auch nur innerhalb der Shell - in VBA bleibt der %UserName% bestehen wie er ist.

Ich wollte damit nur verdeutlichen, dass es grundsätzlich möglich ist, den Wert der Umgebungsvariablen Username zu ändern, was bei "echten" Benutzernamen nicht so einfach möglich ist !

Eine sicherere Methode als per ENVIRON() den Benutzername zu prüfen ist diese Methode per Windows API :

Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
    "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Function WinUserName() As String
    ' Returns the network login name
    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
        WinUserName = Left(strUserName, lngLen - 1)
    Else
        WinUserName = vbNullString
    End If
End Function

Sub ADMIN_Test()
    If UCase(WinUserName) = "ADMIN" Then
        MsgBox "Administrator !"
    Else
        MsgBox "Leider nicht ADMIN !"
    End If
End Sub

Gruß, NoNet


  

Betrifft: AW: Doch, das stimmt... von: Reinhard
Geschrieben am: 20.12.2011 16:38:58

Hallo NoNet,

danke daß du nochmal reingeschaut hast :-)

****klaro : Per Shell aus VBA heraus muss man das mit cmd.exe /c aufrufen ...****

Du also auch, das wollte ich wissen. Ich muß bei meinem WinXP cmd /c auch bei Start---Ausführen voransetzen, ist das bei dir auch so? Ich war irritiert daß du nur von Set ...
geschrieben hast.
Set ist wie "Dir" keine einzelne Exe-Datei sondern in Command.exe bzw. cmd.exe eingebaut.
Also wundert es mich nicht daß bei
S = Shell("set")
bei mir Fehler 53, datei nicht gefunden., kommt.

Andrerseits ist das frühere Prompt, bzw. jetzt Start---Ausführen irgendwie was anderes.
Denn beim Prompt (=Eingabeaufforderung) reicht set oder dir.

Btw, kennst du Subst? Schöner Befehl. Du hast sicher wie ich einen Unterordner "Test" o.ä. samt ggfs. einigen Unterverzeichnissen um mal was zu testen.
Im Code ist es dann auf die dauer recht lästig immer den kompletten Pfad anzugeben. Deshalb habe ich mir mittels Subst das stark vereinfacht.

In "Autostart", der bei mir diesen Pfad hat:
C:\Dokumente und Einstellungen\ich2\Startmenü\Programme\autostart
habe ich eine .bat Datei erstellt in der u.a. sowas steht:
subst K: c:\test
subst U: c:\test\marion

Klappt vorzüglich.

**** und diese Umgebungsvariable
gilt dann auch nur innerhalb der Shell - in VBA bleibt der %UserName% bestehen wie er ist.****

Ja. So wie ich das sehe ist Username der Name den man angibt wenn man Windows installiert.
Noch ungetestet ist was geschieht wenn ich in die o.g. Batch einfüge:
Set Username=Admin
Mein Bauchgefühl sagt mir daß dann %UserName% Admin sein wird.

****Eine sicherere Methode als per ENVIRON() den Benutzername zu prüfen ist diese Methode per Windows API****

Schaue ich mir noch genauer an.

Gruß
Reinhard


  

Betrifft: @Reinhard : Set ist keine ausführbare Datei von: NoNet
Geschrieben am: 20.12.2011 17:04:30

Hallo Reinhard,

der Befehl SET ist keine ausführbare Datei (EXE, BAT, MSI, COM, VBS, etc.) sondern ein interner "Befehl" der Eingabeaufforderung CMD.EXE (früher unter DOS : Command.Com), daher lässt er sich nicht direkt per SHELL() aufrufen sondern nur als Parameter der CMD.EXE (also: SHELL "cmd.exe /c set.....").
Daher hatte ich in meinem ursprünglichen Beitrag auch geschrieben :

Windows Eingabeaufforderung : SET

Bedeutet also : WINDOWS Eingabeaufforderung starten (per "START - Ausführen : CMD - OK") oder per "START - Programme - Zubehör") und dann in der Eingabeaufforderung SET eingeben :



Klaro kenne ich SUBST - habe ich schon vor über 20 Jahren unter DOS genutzt und auch regelmässig unter Windows - und sogar schon einige Male in EXCEL-Beiträgen erwähnt bzw. empfohlen :

http://www.spotlight-wissen.de/archiv/message/1047049.html
https://www.herber.de/forum/archiv/976to980/t979789.htm#979794
http://www.spotlight-wissen.de/archiv/message/581302.html
etc. ;-)

Übrigens : Die Umgebungsvariable %Username% ist nicht der Name, den man beim Installieren von Windows angegeben hat, sondern der Name des Benutzerprofiles mit dem man sich anmeldet.
Innerhalb einer CMD-Sitzung (z.B. BATCH-Datei) bleibt der geänderte Wert der Umgebungsvariablen erhalten, aber er "vererbt" sich nicht auf das globale Windows-System, so dass er per Environ("Username") in VBA nicht abgefragt werden kann.
Es gibt allerdings auch die Möglichkeit eine Umgebungsvariable GLOBAL zu verändern, diese Methode ist mir jedoch gerade entfallen (einzig in den Systemeigenschaften lässt sich das ändern - jedoch erst nach Reboot des PCs gültig).

Gruß, NoNet


  

Betrifft: AW: Username Admin berechtigen von: Johannes K.
Geschrieben am: 19.12.2011 12:48:08

Ich bin gerade noch auf der Suche nach dem Code, den ich in das 2. Sub kopieren muss. Wo wird denn abgefragt, welcher Username (als Beispiel einfach "klotz") alle Mappen einsehen können soll? Es geht mir dabei um eine Datei, in der jeder Mitarbeiter seine Stunden einträgt, aber nicht bei allen anderen einsehen können soll, wer schon wie viel Urlaub hatte etc. Deshalb die Beschränkung über die Netzwerkkennung. Das sich dieses sehr einfach umgehen lässt, wenn es jmd. will, war mir auch klar, aber es ist trotzdem eine nette Lösung. Ich müsste jetzt wie weiter oben geschrieben nur noch den Code so angepasst bekommen, das ein vorgegebener Benutzer alles einsehen kann ohne Beschränkungen, er quasi ausgeschlossen wird von dem Makro.

Danke schon einmal für eure Mühen.

PS:
Falls es wichtig werden sollte nutzen hier alle Win7 und Excel 2010.


  

Betrifft: Mumpitz von: Rudi Maintaire
Geschrieben am: 19.12.2011 14:51:33

Hallo,
um das auszuhebeln, muss man doch nur die Events ausschalten.
Im Direktfenster Application.EnableEvents=False und schon läuft Workbook_SheetActivate nicht mehr.

Hast du ein Prob mit deiner Tastatur?

Gruß
Rudi


  

Betrifft: AW: Zugriffsrechte auf Arbeitsblatt pro Benutzer von: Johannes K.
Geschrieben am: 19.12.2011 15:41:15

Über eine andere Lösung wäre ich jederzeit dankbar! Wenn du mit der Tastatur meinst, dass einige Zeichen in dem Code sind, die da nicht reingehören: da ist was beim Kopieren schief gelaufen, den original Code findet man über den Link.

LG

Johannes


  

Betrifft: AW: Zugriffsrechte auf Arbeitsblatt pro Benutzer von: Rudi Maintaire
Geschrieben am: 20.12.2011 10:23:05

Hallo,
in dieseArbeitsmappe:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Dim wks As Worksheet
  Application.ScreenUpdating = False
  Sheets("NoMacro").Visible = True
  For Each wks In Worksheets
    wks.Visible = (wks.Name = "NoMacro") * 3 + 2
  Next
  Me.Save
End Sub

Private Sub Workbook_Open()
  Dim strUser As String, wks As Worksheet
  With Application
    .EnableCancelKey = False
    .ScreenUpdating = False
  End With
  strUser = Environ("Username")
  On Error GoTo ERRHANDLER
  Select Case LCase(strUser)
    Case "admin"
      For Each wks In Worksheets
        wks.Visible = True
      Next
    Case Else
      Sheets(strUser).Visible = True
  End Select
  Sheets("NoMacro").Visible = 2
ERRHANDLER:
  Application.EnableCancelKey = True
  If Err.Number Then
    MsgBox "Kein Zugriff erlaubt!", , "Berechtigungsprüfung"
    Me.Close
  End If
End Sub

zusätzlich ein Blatt 'NoMacro' einfügen!

Gruß
Rudi


Beiträge aus den Excel-Beispielen zum Thema "Zugriffsrechte auf Arbeitsblatt pro Benutzer"