Kein Schreibzugriff (Recht) auf C:\Windows\Fonts

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von razor8.

    Kein Schreibzugriff (Recht) auf C:\Windows\Fonts

    Hallo Leute,

    ich schreib gerade ein kleines Tool, das aus einer ZIP-Datei mehrere Schriftarten in den Ordner C:\Windows\Fonts entpacken und überschreiben soll. Nun bekomme ich leider immer den Fehler, dass ich keine Berechtigung habe auf diesen Systemordner zuzugreifen, auch wenn ich das Programm als Administrator starte (+ passender Manifesteintrag). Woran liegt das, und wie kann ich das lösen? Ich hab jetzt ne ganze Zeit im Netz gesucht und nicht brauchbares (mit Beispiel) gefunden, außer die DirectoryObjectSecurity-Klasse, die ich aber Aufgrund des fehlenden Beispiels nicht verstehe.Hoffentlich könnt ihr mir weiter helfen. Danke

    Hier ist der Code, der den Fehler verursacht:

    VB.NET-Quellcode

    1. Using zip As ZipFile = ZipFile.Read(fontszippath)
    2. For Each a As ZipEntry In zip
    3. Try
    4. logbox.AppendText("Extracting: " & a.FileName & vbCrLf)
    5. a.Extract("C:\Windows\Fonts\", ExtractExistingFileAction.OverwriteSilently)
    6. Catch ua_ex As UnauthorizedAccessException
    7. logbox.AppendText(ua_ex.Message & vbCrLf)
    8. GoTo fail
    9. Catch ex As Exception
    10. logbox.AppendText("Extracting: " & a.FileName & "FAILED" & vbCrLf)
    11. GoTo fail
    12. End Try
    13. Next
    14. End Using


    Die ua_ex Exeption gibt mir diese Message aus: "Access to the path 'C:\Windows\Fonts\timesbi.ttf' is denied."
    Ich benutze DotNetZip für das entpacken der ZIP-Datei, das sollte doch kein problem sein?

    Nun mein Frage ist jetzt, wie ich die ensprechenden Rechte bekomme ohne sie für immer fest zu setzen? Ich will ja nicht nicht das AccessManagement ausschalten, sondern nur kurz "umgehen".
    Danke für eure Hilfe!
    danke für den hinweiß... werd versuchen erst in %temp% zu entpacken und dann nach c:\windows\fonts zu kopieren

    edit: also entpacken nach temp funktioniert einwandfrei nur bekomme ich trotzdem diese Meldung "Access to the path 'C:\Windows\Fonts\timesbi.ttf' is denied." wenn ich die entsprechende Schriftart nach c:\windows\fonts kopiere(Auch als Administrator).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „razor8“ ()

    die fonts die ich installieren will existieren bereits und ich will sie erstetzen bzw neu installieren, da einige dieser fonts beschädigt worden sind (das ist der zweck des programmes)

    so ich hab mir jetzt überberlegt, das ich erst den font deinstallieren muss, dann aus dem ordner "Fonts" löschen muss, den neuen nach "Fonts" kopieren und dann installiere.

    die variable "thing" entspricht dem Dateipfad der Schriftart im Temporären-Ordner
    die variable "fonts" entspricht "C:\Windows\Fonts\"

    hier ist mein code:

    VB.NET-Quellcode

    1. For Each thing In copyed_fonts
    2. Dim Retval As Long
    3. logbox.AppendText("UnInstalling: " & Path.GetFileName(thing) & vbCrLf)
    4. Retval = RemoveFontResource(thing)
    5. If Retval = 0 Then
    6. logbox.AppendText("UnInstalling: " & Path.GetFileName(thing) & " FAILED" & vbCrLf)
    7. GoTo skip
    8. End If
    9. Try
    10. File.Delete(fonts & Path.GetFileName(thing))
    11. Catch ex As Exception
    12. logbox.AppendText("Deleting: " & Path.GetFileName(thing) & " FAILED" & vbCrLf)
    13. GoTo skip
    14. End Try
    15. Dim fi As System.IO.FileInfo
    16. Try
    17. Dim res As Integer
    18. fi = New System.IO.FileInfo(thing)
    19. Dim fiTarget As New System.IO.FileInfo(fonts & Path.GetFileName(thing))
    20. If fiTarget.Exists Then
    21. logbox.AppendText("Font already exists: " & Path.GetFileName(thing & vbCrLf))
    22. GoTo skip
    23. End If
    24. fi.CopyTo(fonts & Path.GetFileName(thing))
    25. res = CreateScalableFontResource(0, thing & ".fot", fonts & Path.GetFileName(thing), String.Empty)
    26. Dim rt As Integer = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
    27. res = AddFontResource(fonts & Path.GetFileName(thing))
    28. If res <> 0 Then
    29. SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
    30. End If
    31. Catch ex As Exception
    32. logbox.AppendText(ex.Message & vbCrLf)
    33. End Try
    34. skip:
    35. Try
    36. File.Delete(thing)
    37. Catch ex As Exception
    38. logbox.AppendText(ex.Message & vbCrLf)
    39. End Try
    40. Next


    aber leider komm ich nciht weiter als bis zum Deinstallieren.

    Retval ist immer 0 also springt er raus.... warum kalppt das nicht?