mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas-jkfd (Gast)


Bewertung
0 lesenswert
nicht 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
Public Sub FileTest()
    Dim path As String
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    
    path = "\\path.to\folder\"
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(path)
    
    For Each objFile In objFolder.Files
        ' Hier Absturz bei öffnen von "objFile.path", wenn keine Leserechte.
    Next objFile
End Sub

von c-hater (Gast)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
So?
Private Const FILE_ALL_ACCESS = &H1F01FF
Private Const FILE_APPEND_DATA = &H4
Private Const FILE_DELETE = &H10000
Private Const FILE_DELETE_CHILD = &H40
Private Const FILE_EXECUTE = &H20
Private Const FILE_READ_ATTRIBUTES = &H80
Private Const FILE_READ_CONTROL = &H20000
Private Const FILE_READ_DATA = &H1
Private Const FILE_READ_EA = &H8
Private Const FILE_SYNCHRONIZE = &H100000
Private Const FILE_WRITE_ATTRIBUTES = &H100
Private Const FILE_WRITE_DAC = &H40000
Private Const FILE_WRITE_DATA = &H2
Private Const FILE_WRITE_EA = &H10
Private Const FILE_WRITE_OWNER = &H80000

Public Sub test()
    Dim lngReturn As Long
    lngReturn = Check_Folderaccess("C:\")
    If Not lngReturn And FILE_WRITE_DATA Then MsgBox "Nicht schreiben"
    If Not lngReturn And FILE_READ_DATA Then MsgBox "Nicht lesen"
    If lngReturn And (FILE_WRITE_DATA Or FILE_READ_DATA) Then MsgBox "Vollzugriff"
End Sub

Private Function Check_Folderaccess(strFolder As String) As Long
    Dim objWMI As Object, objItem As Object
    Dir$ ""
    strFolder = (Replace(strFolder, "\", "\\"))
    Set objWMI = GetObject("winmgmts:\\.\root\cimv2"). _
        ExecQuery("Select * from Win32_Directory Where Name = '" & strFolder & "'")
    For Each objItem In objWMI
        Check_Folderaccess = objItem.AccessMask
    Next
End Function

: Bearbeitet durch User
von leo (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
In VBA spielt das keine Rolle auf Einzelplatzrechnern.

von leo (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von leo (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Zumindest kann man Leserechte von Ordnern doch auslesen. 😉

von leo (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Eventuell geht es auch mit "FileSystemObject".

von René H. (mumpel)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Doch, Du schreibst doch selbst
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)


Bewertung
0 lesenswert
nicht lesenswert
Mein Beispielcode kommt von einem Profi (aus dem Herber-Forum).

von leo (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Thomas-jkfd schrieb:
> Ich sehe kein Problem mit SQL-Injection.

Darum gewoeht man sich an worst praxis. Passt schon.

leo

von leo (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

Na gut. Ich wuerde das z.B. so machen:
#!/usr/bin/perl -w

$dirname = "/tmp";

opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";
while( ($filename = readdir(DIR))) {
   print("$filename\n");
}
closedir(DIR);

leo

von Thomas-jkfd (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.