Forum: PC-Programmierung VBA: Datei auf Leserechte prüfen


von Thomas-jkfd (Gast)


Lesenswert?

Hallo,

ich habe folgenden VBA Code, der Dateien im Netztwerklaufwerk ausliest.
Funktioniert auch prima, solange ich Leserechte habe.
Ohne Leserechte strürzt es ab.
Wie kann ich objFile vorher auf Leserechte prüfen?

Danke
1
Public Sub FileTest()
2
    Dim path As String
3
    Dim objFSO As Object
4
    Dim objFolder As Object
5
    Dim objFile As Object
6
    
7
    path = "\\path.to\folder\"
8
    
9
    Set objFSO = CreateObject("Scripting.FileSystemObject")
10
    Set objFolder = objFSO.GetFolder(path)
11
    
12
    For Each objFile In objFolder.Files
13
        ' Hier Absturz bei öffnen von "objFile.path", wenn keine Leserechte.
14
    Next objFile
15
End Sub

von c-hater (Gast)


Lesenswert?

Thomas-jkfd schrieb:

> Wie kann ich objFile vorher auf Leserechte prüfen?

Kannst du nicht.

Was du aber machen kannst: den Fehler fangen. Und dann entweder die 
Sache insgesamt kontrolliert abbrechen oder mit dem nächsten Eintrag in 
der Schleife erneut dein Glück versuchen. Was sinnvoller ist, hängt von 
der Anwendung ab.

Wie? Siehe VBA-Hilfe zum Thema "on error"...

Jeder, aber auch absolut jeder Programmierer jeder, aber auch absolut 
jeder Programmiersprache würde als erstes die jeweilige Sprachreferenz 
auf Ansätze für Lösungsmöglichkeiten untersuchen...

Du bist wohl kein Programmierer...

von René H. (mumpel)


Lesenswert?

So?
1
Private Const FILE_ALL_ACCESS = &H1F01FF
2
Private Const FILE_APPEND_DATA = &H4
3
Private Const FILE_DELETE = &H10000
4
Private Const FILE_DELETE_CHILD = &H40
5
Private Const FILE_EXECUTE = &H20
6
Private Const FILE_READ_ATTRIBUTES = &H80
7
Private Const FILE_READ_CONTROL = &H20000
8
Private Const FILE_READ_DATA = &H1
9
Private Const FILE_READ_EA = &H8
10
Private Const FILE_SYNCHRONIZE = &H100000
11
Private Const FILE_WRITE_ATTRIBUTES = &H100
12
Private Const FILE_WRITE_DAC = &H40000
13
Private Const FILE_WRITE_DATA = &H2
14
Private Const FILE_WRITE_EA = &H10
15
Private Const FILE_WRITE_OWNER = &H80000
16
17
Public Sub test()
18
    Dim lngReturn As Long
19
    lngReturn = Check_Folderaccess("C:\")
20
    If Not lngReturn And FILE_WRITE_DATA Then MsgBox "Nicht schreiben"
21
    If Not lngReturn And FILE_READ_DATA Then MsgBox "Nicht lesen"
22
    If lngReturn And (FILE_WRITE_DATA Or FILE_READ_DATA) Then MsgBox "Vollzugriff"
23
End Sub
24
25
Private Function Check_Folderaccess(strFolder As String) As Long
26
    Dim objWMI As Object, objItem As Object
27
    Dir$ ""
28
    strFolder = (Replace(strFolder, "\", "\\"))
29
    Set objWMI = GetObject("winmgmts:\\.\root\cimv2"). _
30
        ExecQuery("Select * from Win32_Directory Where Name = '" & strFolder & "'")
31
    For Each objItem In objWMI
32
        Check_Folderaccess = objItem.AccessMask
33
    Next
34
End Function

: Bearbeitet durch User
von leo (Gast)


Lesenswert?

René H. schrieb:
> ExecQuery("Select * from Win32_Directory Where Name = '" &
> strFolder & "'")

und schon hast du eine herrliche SQL-Injection, zumindest wenn du 
strFolder nicht 100% kontrollieren kannst:
https://xkcd.com/327/

leo

von René H. (mumpel)


Lesenswert?

In VBA spielt das keine Rolle auf Einzelplatzrechnern.

von leo (Gast)


Lesenswert?

René H. schrieb:
> In VBA spielt das keine Rolle auf Einzelplatzrechnern.

Genau und darum kann man sich Worst-Praxis locker aneignen, bis man mal 
auf ein anderes System kommt, oder man doch mehrere Benutzer hat, oder 
...

leo

von René H. (mumpel)


Lesenswert?

leo schrieb:
> René H. schrieb:
>> In VBA spielt das keine Rolle auf Einzelplatzrechnern.
>
> Genau und darum kann man sich Worst-Praxis locker aneignen, bis man mal
> auf ein anderes System kommt, oder man doch mehrere Benutzer hat, oder
> ...
>
> leo

Ich habe noch nie gehört, dass man SQL-Injection auch auf Festplatten 
nutzen kann. M.W. hat SQL-Injection was mit Datenbanken und 
Web-Anwendungen zu tun. Der TO will aber nur eine Datei auf einer 
Festplatte öffnen.

: Bearbeitet durch User
von leo (Gast)


Lesenswert?

René H. schrieb:
> Der TO
> will aber nur eine Datei auf einer Festplatte öffnen.

... was je nach vorhandenen Dateinamen schon fatal sein kann.

leo

von René H. (mumpel)


Lesenswert?

Kann man aber eingrenzen wenn man nur bestimmte Dateiformate zum Öffnen 
zulässt. Auch VBA-"Profis" nutzen "ExecQuery" ohne Probleme.

von leo (Gast)


Lesenswert?

René H. schrieb:
> Auch VBA-"Profis" nutzen "ExecQuery"

darum haben auch Windows und speziell VBA-"Programmierer" so einen guten 
Ruf, wenn es um das Hinterlassen solcher Exploits geht ;-)

leo

von René H. (mumpel)


Lesenswert?

Zumindest kann man Leserechte von Ordnern doch auslesen. ?

von leo (Gast)


Lesenswert?

René H. schrieb:
> Zumindest kann man Leserechte von Ordnern doch auslesen. ?

Was hast du bei "Bobby Tables" nicht verstanden?

leo

von René H. (mumpel)


Lesenswert?

Eventuell geht es auch mit "FileSystemObject".

von René H. (mumpel)


Lesenswert?

BTW:
Der TO möchte wissen ob man Ordnerrechte auslesen kann. Da finde ich es 
nicht gut ihm Angst zu machen. Ob er VBA auf die Netzwerklaufwerke 
loslassen darf muss oder sollte er ohnehin seinen Netzwerkadministrator 
fragen, er wird ihm dann schon sagen ob es als gefährlich eingestuft und 
deshalb untersagt werden muss.

von leo (Gast)


Lesenswert?

René H. schrieb:
> Der TO möchte wissen ob man Ordnerrechte auslesen kann. Da finde ich es
> nicht gut ihm Angst zu machen

Da finde ich es nicht gut so unsichere Vorschlaege zu machen.

leo

von Thomas-jkfd (Gast)


Lesenswert?

René H. schrieb:
> Eventuell geht es auch mit "FileSystemObject".

Das war auch mein erster Gedanke, da ich es ohnehin bereits verwende.
Scheint aber nicht zu gehen:
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/attributes-property

von René H. (mumpel)


Lesenswert?

Da bleibt aber nichts mehr übrig. Außer vielleicht über ein COM-Add-In.

: Bearbeitet durch User
von René H. (mumpel)


Lesenswert?

leo schrieb:
> René H. schrieb:
>> Der TO möchte wissen ob man Ordnerrechte auslesen kann. Da finde ich es
>> nicht gut ihm Angst zu machen
>
> Da finde ich es nicht gut so unsichere Vorschlaege zu machen.
>
> leo

Dann sage doch bitte wie man es besser macht. Nicht immer nur schimpfen, 
sondern auch mal hilfreiche Vorschläge machen.

: Bearbeitet durch User
von Thomas-jkfd (Gast)


Lesenswert?

Ich sehe kein Problem mit SQL-Injection.
* Benutzereingaben gibt es nicht.
* Das Script läuft mit Userrechten, kann also nichts, was der User nicht 
auch selbst könnte.
* Wie soll denn bitteschön ein Verzeichnis benannt werden um einen 
Befehl einzuschleusen?

von Frank _. (fbi)


Lesenswert?

René H. schrieb:
> Da bleibt aber nichts mehr übrig. Außer vielleicht über ein COM-Add-In.

Doch, Du schreibst doch selbst
1
Auch VBA-"Profis" nutzen "ExecQuery" ohne Probleme.
Der Unterschied ist nur, die "Profis" wissen wie sie es zu benutzen 
haben ohne gleich sämtliche Scheunentore zu öffnen.

von René H. (mumpel)


Lesenswert?

Mein Beispielcode kommt von einem Profi (aus dem Herber-Forum).

von leo (Gast)


Lesenswert?

René H. schrieb:
> Dann sage doch bitte wie man es besser macht.

Ich bin weder Windows- noch VBA-Programmierer. Ich habe nur auf einen 
kraassen Sicherheitsmangel hingewiesen.

leo

von leo (Gast)


Lesenswert?

Thomas-jkfd schrieb:
> Ich sehe kein Problem mit SQL-Injection.

Darum gewoeht man sich an worst praxis. Passt schon.

leo

von leo (Gast)


Lesenswert?

René H. schrieb:
> Mein Beispielcode kommt von einem Profi (aus dem Herber-Forum).

Na denn, wenn's im Internet stand ist es sicher korrekt und gut.

leo

von René H. (mumpel)


Lesenswert?

leo schrieb:
> Ich bin weder Windows- noch VBA-Programmierer.

Das macht nichts. Beispielcode ist immer gut, egal in welcher 
Programmiersprache. Vielleicht kann ich mir davon was abschauen. Ich 
kann zwar kein Englisch, aber "Code-Analyse" schon.

von leo (Gast)


Lesenswert?

René H. schrieb:
> Beispielcode ist immer gut, egal in welcher
> Programmiersprache.

Na gut. Ich wuerde das z.B. so machen:
1
#!/usr/bin/perl -w
2
3
$dirname = "/tmp";
4
5
opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";
6
while( ($filename = readdir(DIR))) {
7
   print("$filename\n");
8
}
9
closedir(DIR);

leo

von Thomas-jkfd (Gast)


Lesenswert?

Hallo,

ich komme in den Order rein, und sehe auch alle dateien.
Aber ich kann sie nicht öffnen.

Es handelt sich um Dateien im Netzwerklaufwerk: 
"\\path.to\folder\file.txt"
Netzwerklaufwerk funktioniert mit Renés Code leider nicht.

c-haters Vorschlag mit "On Error..." ist naheliegend und funktioniert 
nicht.

Besonders ärgerlich ist, dass der Absturz erst nach Minuten und einigen 
OLE Meldungen kommt.
Ich würde gerne erst auf Leserechte prüfen, und ggf. eine Meldung geben.

von René H. (mumpel)


Lesenswert?

Ist das für die Arbeit, also dem Arbeitgeber? Dann soll der einen 
"professionellen" Programmierer ranlassen. Oder der Arbeitgeber soll die 
Rechte anders vergeben (lassen).

Mal davon abgesehen kann ich nicht nachvollziehen weshalb jemand Excel 
benutzt um Textdateien zu öffnen. Bei CSV könnte ich es verstehen wenn 
diese in Exceldateien eingelesen werden sollen, aber dann soll der 
Arbeitgeber gefälligst dafür sorgen, dass der Arbeitnehmer seine 
Aufgaben erfüllen kann.

von Thomas-jkfd (Gast)


Lesenswert?

Ja, ist für die Arbeit.

Wie kommst du auf Excel?

Natürlich kannst du das nicht nachvollziehen, da ich den Code auf ein 
Minimalbeispiel heruntergebrochen habe um das Problem zu zeigen.
In wirklichkeit sind es auch keine Textdateien, ist aber auch 
irrelevant.

Ich versuche gerade Hilfe von "professionellen" Programmierern zu 
bekommen ;)

von René H. (mumpel)


Lesenswert?

Wir ich auf Excel komme? VBA (Visual Basic for Applications) ist in 
Microsoft Office integriert. Ich kenne kein anderes PC-Programm in dem 
VBA integriert ist.

Der externe Programmierer kann aber nichts erreichen wenn Dir die 
Ordnerberechtigungen fehlen.

: Bearbeitet durch User
von Thomas-jkfd (Gast)


Lesenswert?

VBA gibt es zumindest mal für:
Excel, Word, Powerpoint, Outlook, Visio, Access, Project, FrontPage, 
AutoCAD, ArcGIS, ARIS, CATIA, SolidWorks, MindManager, Corel

Ich möchte keine Rechte haben, ich möchte sie nur abfragen.

von René H. (mumpel)


Lesenswert?

Dann solltest Du mehr Angaben machen. Oder Dich an ein entsprechenden 
Fachforum nachfragen. Für MSO gibt es einige (z.B.: ms-office-forum.net, 
xlforum.herber.de, clever-excel-forum.de), in den genannten bin ich 
selber tätig. Vielleicht hat ja doch jemand in den Fachforen eine 
funktionierende und sichere Lösung.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.