VBA: Datei auf Leserechte prüfen

Gast #6175564
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
Gast #6175613
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...
#6175659
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
#6175696
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.
#6175802
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.
Gast #6175910
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?
Gast #6176605
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
Gast #6176625
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.
#6176638
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.
Gast #6176710
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 ;)
Gast #6176835
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.
#6176961
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren