Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1240to1244
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Zugriffsrechte auf Arbeitsblatt pro Benutzer

Zugriffsrechte auf Arbeitsblatt pro Benutzer
Johannes
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.

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Username Admin berechtigen
19.12.2011 12:09:19
NoNet
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
Anzeige
Set Username=Admin
19.12.2011 12:23:01
Reinhard
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
AW: Set Username=Admin
19.12.2011 12:40:51
Johannes
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.
Anzeige
Mappe nur mit aktivierten makros
19.12.2011 15:46:08
Reinhard
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
Anzeige
Doch, das stimmt...
20.12.2011 14:35:22
NoNet
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
Anzeige
AW: Doch, das stimmt...
20.12.2011 16:38:58
Reinhard
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
Anzeige
@Reinhard : Set ist keine ausführbare Datei
20.12.2011 17:04:30
NoNet
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 :
Userbild
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
Anzeige
AW: Username Admin berechtigen
19.12.2011 12:48:08
Johannes
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.
Anzeige
Mumpitz
19.12.2011 14:51:33
Rudi
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
AW: Zugriffsrechte auf Arbeitsblatt pro Benutzer
19.12.2011 15:41:15
Johannes
Ü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
AW: Zugriffsrechte auf Arbeitsblatt pro Benutzer
20.12.2011 10:23:05
Rudi
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
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen