Laden...

Systemobjekte im Startmenü lassen sich nicht löschen - Zugriff verweigert

Erstellt von brave_snoopy vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.242 Views
B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 8 Jahren
Systemobjekte im Startmenü lassen sich nicht löschen - Zugriff verweigert

Hallo,

mein Programm läuft im Kontext des angemeldeten Benutzers und soll alle Verknüpfungen in seinem Startmenü löschen.

Dafür habe ich folgende Methode:


public void ClearDirectory(string path)
        {
            //System Dirs who cannot be deletes
            List<string> SystemDirs = new List<string>();
            SystemDirs.Add("Accessories");
            SystemDirs.Add("Ease of Access");
            SystemDirs.Add("System Tools");
            SystemDirs.Add("Administrative Tools");
            SystemDirs.Add("Startup");
            SystemDirs.Add("Maintenance");
            
            //End System Dirs            
            
            DirectoryInfo dir = new DirectoryInfo(path);
            foreach(DirectoryInfo subDir in dir.GetDirectories())
            {
               if(!SystemDirs.Contains(subDir.Name))
               {
                   subDir.Delete(true);
               }
                
            }
            foreach(FileInfo file in dir.GetFiles())
            {
                file.Delete();
            }
            
        }

Und rufe diese wie folgt auf:

ClearDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Programs));

Damit werden alle Anwendungsverknüpfungen im Startmenü des derzeitigen Benutzers gelöscht. Dies sind idr. nicht viele. Nur die, welche durch das Default Profil bei der 1. Anmeldung dort erstellt wurden.

Oben in der Methode habe ich ein paar Verzeichnisse aufgelistet. Wenn ich versuche diese über mein Programm löschen zu lassen, erhalte ich eine Fehlermeldung "Zugriff verweigert". Lösche ich den Ordner als angemeldet Benutzer manuell über den Windows Explorer, so funktioniert dies einwandfrei.

Scheinbar hat hier .Net eine Abfrage bzw. Sicherheit, keine Systemordner zu löschen.

Habt ihr eine Idee, wie ich das Problem beheben kann?

H
523 Beiträge seit 2008
vor 8 Jahren

Kommt der Fehler auch, wenn Du die Anwendung als Administrator ausführst?

Vielleicht hilft Dir dieser Link: How to request administrator permissions when the program starts?

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 8 Jahren

Hallo,

der Benutzer verfügt über keinerlei Admin Berechtigungen, daher wird das nicht funktionieren.
Interessant ist ja, dass der Benutzer die Ordner selbst löschen kann, nur eben die .NET Anwendung nicht.
Ich tippe, dass es irgendwas mit der Löschen Funktion zu tun hat.

U
135 Beiträge seit 2009
vor 8 Jahren

Hi,

hab Deinen Code grade mal in einer Windows 7 SP1 VM (Standardinstallation, zusätzlich Office und VS installiert) getestet... funktioniert 1a.

Was spricht der Debugger? Bei welchem File/Folder exakt fliegt er auf die Nase? Nur bei einem, oder bei mehreren? Ist evtl. eines der Files in use?

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 8 Jahren

Also bei mir fliegt er bei allen Foldern auf die Nase mit "Zugriff Verweigert".
(Habe die UAC deaktiviert)

U
135 Beiträge seit 2009
vor 8 Jahren

Kanns sein, dass wir aneinander vorbeireden?

Ich dachte, Du willst alles AUSSER den aufgelisteten Ordnern löschen... Du definierst sie ja selbst als "System Dirs who cannot be deleted". Und mit Deinem Code löschst Du alles außer diesen System Dirs:

if(**:::

Diese Ordner lassen sich in der Tat nicht so ohne weiteres löschen... das hat aber mit .NET meiner Meinung nach nichts zu tun... probiers mal mit einem rmdir - kriegst Du auch ein Access Denied.

Warum es allerdings über Windows Explorer problemlos klappt, ist mir auch ein Rätsel...

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 8 Jahren

Hi,

Das tut mir leid. Ja ich möchte alle Ordner löschen. Ich habe die Ausnahme nur gebaut, damit mein Programm nicht auf die Nase fällt.

Aber danke das du mich trotzdem verstanden hast.

Hast du denn eine Idee, wie ich diese Ordner doch löschen kann? interessant ist ja, dass ich sie geleert bekomme, aber nicht gelöscht 😉

Evtl. Die winapi Funktion direkt aufrufen?

5.658 Beiträge seit 2006
vor 8 Jahren

Hi brave_snoopy,

hab ich das richtig verstanden, daß du die Systemsteuerung aus dem Startmenü löschen möchtest, und dich darüber wunderst, daß das nicht funktioniert? Ich glaube, solche Sachen sollte man gar nicht erst ausprobieren...

Christian

Weeks of programming can save you hours of planning

16.841 Beiträge seit 2008
vor 8 Jahren

Kann das sein, dass das Ordner sind, die nur im Explorer so heissen?
Als Beispiel fällt mir da bei Win7 zB der Benutzerordner ein, der auch nur ein Hardlink auf C:\Users darstellt - es sind ja spezielle Systemordner und deswegen in .NET auch über die .NET Enums so kategorisiert.

In Unternehmensnetzwerken können diese oft durch die Policy nicht gelöscht werden oder aber weil der Benutzer über den "AllUsers"-Account unfreiwillig injeziert bekommt.
Ich hab am GeschäftsPC auch einige Links und Ordner, die mich nerven aber durch die IT gepusht werden und dadurch nicht löschbar sind.

Insgesamt hört sich das sehr nach Unternehmensnetzwerk an; und falls Du Deinen Benutzern irgendwelche Ordner wegnehmen willst, sodass diese nicht sichtbar sind, dann verwende die Policy Tools von Microsoft, die genau für diesen Fall gedacht sind und nicht so nen Schmarrn mit nem C# Tool.

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 8 Jahren

Hi brave_snoopy,

hab ich das richtig verstanden, daß du die Systemsteuerung aus dem Startmenü löschen möchtest, und dich darüber wunderst, daß das nicht funktioniert? Ich glaube, solche Sachen sollte man gar nicht erst ausprobieren...

Christian

Nein, ich möchte nicht die Registrierung aus dem Startmenü löschen.

Insgesamt hört sich das sehr nach Unternehmensnetzwerk an; und falls Du Deinen Benutzern irgendwelche Ordner wegnehmen willst, sodass diese nicht sichtbar sind, dann verwende die Policy Tools von Microsoft, die genau für diesen Fall gedacht sind und nicht so nen Schmarrn mit nem C# Tool.

Ja es geht um eine Unternehmensanwendung und nein, diese Ordner werden nicht von IT gepusht oder sonstwie von irgendwelchen Richtlinien.

Diese Ordner sind die Standardordner bei jedem WIndows 7. Im Deutschen: Zubehör, Wartung, Autostart, Verwaltung...

Diese Ordner werden "erstellt", wenn der Benutzer sich das erste mal an einem PC anmeldet und nicht über ein "Roaming Profil" verfügt. Diese Ordner liegen zum Beispiel im Default Profil unter:

"C:\Users\Default\AppData\Roaming\Microsoft\Windows\Start Menu\Programs" und werden einfach in das neu zu erstellende Profil kopiert. Natürlich kann ich diese Ordner im Default Profil auch entfernen und alle neuen Benutzer bekommen die Ordner nicht mehr.

Ich möchte dieser Ordner aber gerne bei den schon vorhandenen Profilen löschen.
Wie "SomeoneYouKnow" schon schrieb, kann ich die Ordner auch nicht mit rmdir löschen. Mit dem Windows Explorer aber schon. Das ist ja die Krucks an der Sache.

U
135 Beiträge seit 2009
vor 8 Jahren

Was mir noch aufgefallen ist... die Ordner haben die "Read-only" Property, wenn Du Dir mal die Eigenschaften anzeigen lässt. Bin mir aber noch nicht ganz sicher, ob's damit zusammenhängt... leg ich einen neuen Ordner unter Programs an, hat der auch Read-only, ich kann ihn aber trotzdem via rmdir löschen. Was aber noch eigenartiger ist: wenn Du bei einem dieser Special-Folder read-only deaktivierst und direkt danach wieder in die Eigenschaften guckst, ist die Option wieder gesetzt 🤔

16.841 Beiträge seit 2008
vor 8 Jahren

Diese Ordner sind die Standardordner bei jedem WIndows 7. Im Deutschen: Zubehör, Wartung, Autostart, Verwaltung..

Und genau diese Ordner lassen sich durch den Policy-Manager entfernen / weg konfigurieren - auch für bestehende User; sehr wahrscheinlich unter User Configuration\AdministrativeTemplates.

Mit dem Windows Explorer aber schon. Das ist ja die Krucks an der Sache.

Was entweder am Token-Prinzip der Authentifizierung von Windows (ab Vista) liegt oder an der Tatsache, dass der Explorer bei Windows zuerst alle FileAttributes entfernt/auf das Minimum setzt, bevor gelöscht wird.
Denn Attribute wie ReadOnly oder Archiv machen gerne bei .NET Probleme.

Und dann kommt es noch drauf an, ob man aktuell der Owner ist (bei automatisch erstellten Ordnern eher nicht) oder eben das System.

U
135 Beiträge seit 2009
vor 8 Jahren

Und dann kommt es noch drauf an, ob man aktuell der Owner ist (bei automatisch erstellten Ordnern eher nicht) oder eben das System.

Owner ist der User, weiterhin hat er "Full Access" auf den Ordner.

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 8 Jahren

Das klingt so, als wenn ihr auch keine wirkliche Lösung habt.

Irgendeine Idee, vlt eine Delete API direkt anzusprechen? Gibt es da irgendwas im Bereich C++/WINAPI direkt?

B
brave_snoopy Themenstarter:in
99 Beiträge seit 2011
vor 8 Jahren

DeleteFile scheint ja nur für Dateien zu sein. Ich habe mal nach RemoveDirectory geschaut und diese Funktion aufgerufen.


[DllImport("kernel32.dll")]
        public static extern bool RemoveDirectory(string path);
        
        private void ClearSystemDir(string path)
        {

            RemoveDirectory(@"C:\Users\testuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories\System Tools");

        }

Die Funktion funktioniert, "normale" Ordner werden gelöscht. Aber diese "System Dirs" nicht. Interessanterweise gibt es nicht mal eine Fehlermeldung. Es passiert einfach nichts.

16.841 Beiträge seit 2008
vor 8 Jahren

Das liegt daran, dass Du Dir nicht angeschaut hast, wie die Methode funktioniert.
Wenn die Win32 Funktion false zurück liefert gibt es einen Fehler.
Diesen musst Du aber über die Win32Exception abrufen.