none
in eine .txt schreiben bei win XP RRS feed

  • Allgemeine Diskussion

  • Hallo, ich habe ein Programm welches in ein mehrere Dokumente schreiben muss, das geht auch alles bei win 7 aber nicht bei win XP

    ich setze die Datei rechte folgendermaßen:

                                                                      

    public void SetFilePermissions(string path)
            {

                List<String> fileName = new List<string>();

                fileName = GetFileList(path, true); //Gibt eine Liste aller Dateien zurück mit Pfad

                try
                {
                    for (int i = 0; i < fileName.Count; i++)
                    {
                        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
                        FileSecurity fs = File.GetAccessControl(fileName[i].ToString());

                        // add a new file access rule w/ write/modify for all users to the file security object
                        fs.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify | FileSystemRights.Read | FileSystemRights.FullControl, AccessControlType.Allow)); 

                                                                                                                                                                                                                             // Turn write and modify on


                        // Apply the file security to the directory
                        File.SetAccessControl(fileName[i].ToString(), fs);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Fehler beim Setzen der Datei Rechte.");
                }

           }

    Dabei kommt auch kein Fehler.

    hat jemand eine Idee?

    mfg Ralf Neumann


    Montag, 18. Juni 2012 20:32

Alle Antworten

  • Hallo Ralf,

    warum setzt Du die Berechtigungen auf eine Datei, wenn Du eigentlich in eine Datei schreiben willst?

    Wenn kein Fehler kommt, wird das Ganze wohl auch durchlaufen. Setz doch mal einen Breakpoint auf die erste Zeile. Ggfs. gibt "GetFileList" ja auch nichts zurück, dann würde die Schleife auch nicht durchlaufen und es tritt kein Fehler auf^^


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 18. Juni 2012 20:59
    Moderator
  • genau da is das Problem, das is eine installer klasse, welche beim setup ausgeführt wird. da kann ich leider keinen breakpoint setzen 
    Montag, 18. Juni 2012 21:13
  • genau da is das Problem, das is eine installer klasse, welche beim setup ausgeführt wird. da kann ich leider keinen breakpoint setzen 

    Dann lass dir die Liste der Dateien doch mal irgendwohin ausgeben (notfalls in eine Datei im Temp Verzeichnis).

    Das Setup wird als Admin gestartet?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 18. Juni 2012 21:31
    Moderator
  • das hab ich gemacht, dort führt er mir alle relevanten dateien auf(alle in dem ordner und unterordnern) das funktioniert ja auch bei meinem win7 aber halt nicht bei win xp das is ja mein problem.
    Montag, 18. Juni 2012 22:05
  • das hab ich gemacht, dort führt er mir alle relevanten dateien auf(alle in dem ordner und unterordnern) das funktioniert ja auch bei meinem win7 aber halt nicht bei win xp das is ja mein problem.

    Bist Du sicher, dass es nicht funktioniert? Wenn kein Fehler kommt, die Dateiliste Ok ist, die Schleife durchlaufen wird, ... sollte das auch durchgelaufen sein.

    Evtl. erhältst Du auch einfach nicht das erwartete Ergebnis. Ein Beispiel: Du erstellst einen Dienst, der mit NETWORK SERVICE bzw. NETZWERKDIENST laufen soll. Hier gilt dann: "Jeder" ist eben nicht Jeder. Hier wäre dann "Jeder" bzw. die WorldSid die falsche Zuordnung. Siehe dazu auch:

      http://weaselfire.wordpress.com/2009/07/09/everyone-isnt-everyone/

    Ansonsten musst Du dein Setupprojekt mal mit genauen Ausgaben versehen und ggfs. Logging aktivieren, ...

    Wenn Du eine CustomAction hast, sollte sich das Projekt aber dennoch debuggen lassen. Siehe dazu:

      http://stackoverflow.com/questions/4596637/how-to-debug-vs2010-setup-project

      http://bytes.com/topic/c-sharp/answers/707645-how-debug-setup-projects


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 19. Juni 2012 00:18
    Moderator
  • das hab ich gemacht, dort führt er mir alle relevanten dateien auf(alle in dem ordner und unterordnern) das funktioniert ja auch bei meinem win7 aber halt nicht bei win xp das is ja mein problem.

    Zeig doch mal bitte den genauen Code, mit dem Du die Methode SetFilePermissions( ... ) aufrufst. Bitte keinen Pseudocode oder andere Übergabewerte, hier wäre der _genaue_ Aufruf wichtig.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 19. Juni 2012 00:20
    Moderator
  • Hier ist er 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Configuration.Install;
    using System.ComponentModel;
    using System.Collections;
    using System.Security.Principal;
    using System.IO;
    using System.Security.AccessControl;
    using System.Diagnostics;
    using System.Windows.Forms;
     
     
    namespace installer 
    {
        [RunInstaller(true)]
        public partial class Installer1 : Installer
        {
            //private static string AppDataDir = "";
     
            public override void Install(IDictionary savedState)
            {
                base.Install(savedState);
     
                string strAssemplyPath = Context.Parameters["assemblypath"].ToString();
                string strAppPath = strAssemplyPath.Substring(0, strAssemplyPath.LastIndexOf("\\"));
     
                SetFolderPermissions(strAppPath);
                SetFilePermissions(strAppPath);
     
            }
     
            public void SetFolderPermissions(string path)
            {
                try
                {
     
                    SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
                    DirectoryInfo di = new DirectoryInfo(path);
                    DirectorySecurity ds = di.GetAccessControl();
                    // add a new file access rule w/ write/modify for all users to the directory security object
     
                    ds.AddAccessRule(new FileSystemAccessRule(sid,
                                                              FileSystemRights.Write | FileSystemRights.Modify | FileSystemRights.Read | FileSystemRights.FullControl,
                                                              InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,   // all sub-dirs to inherit
                                                              PropagationFlags.None,
                                                              AccessControlType.Allow));                                            // Turn write and modify on
                    // Apply the directory security to the directory
                    di.SetAccessControl(ds);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Fehler beim Setzen der Ordner Rechte.");
                }
     
            }
     
            //setzt die rechte für alle Dateien im ordner auf schreiben für alle
            public void SetFilePermissions(string path)
            {
     
                List<String> fileName = new List<string>();
     
                fileName = GetFileList(path, true);  //Gibt eine Liste aller Dateien zurück mit Pfad
     
                try
                {
                    for (int i = 0; i < fileName.Count; i++)
                    {
                        SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
                        FileSecurity fs = File.GetAccessControl(fileName[i].ToString());
     
                        // add a new file access rule w/ write/modify for all users to the file security object
                        fs.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify | FileSystemRights.Read | FileSystemRights.FullControl, AccessControlType.Allow)); 
     
                                                                                                                                                                                                                             // Turn write and modify on
     
     
                        // Apply the file security to the directory
                        File.SetAccessControl(fileName[i].ToString(), fs);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Fehler beim Setzen der Datei Rechte.");
                }
     
            }
     
            //Gibt eine Liste aller Dateien zurück mit Pfad
            public List<string> GetFileList(string Root, bool SubFolders)
            {
                List<string> FileArray = new List<string>();
                try
                {
                    string[] Files = System.IO.Directory.GetFiles(Root);
                    string[] Folders = System.IO.Directory.GetDirectories(Root);
     
                    for (int i = 0; i < Files.Length; i++)
                    {
                        FileArray.Add(Files[i].ToString());
                    }
     
                    if (SubFolders == true)
                    {
                        for (int i = 0; i < Folders.Length; i++)
                        {
                            FileArray.AddRange(GetFileList(Folders[i], SubFolders));
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Fehler beim Erstellen der Datei Liste.");
                }
                return FileArray;
            }
        }
    }

    Dienstag, 19. Juni 2012 11:05
  • Debugger.Launch(); an der gewünschten Stelle die du debuggen willst setzen. Sobald das Programm an dieser Stelle ist startet ein Just in Time Debugger Fenster. Das kannst du dann an deine Visual Studio Solution anhängen und schön debuggen.

    Testest du auf einem anderen Rechner kann man die RemoteDebuggin Services nutzen. Siehe: http://msdn.microsoft.com/de-de/library/bt727f1t.aspx

    Dienstag, 19. Juni 2012 11:35
  • Dienstag, 19. Juni 2012 11:37
  • ideen dazu warum ich unter xp nichts in eine datei schreiben kann hast du aber nicht direkt oder? 
    Dienstag, 19. Juni 2012 13:27
  • ideen dazu warum ich unter xp nichts in eine datei schreiben kann hast du aber nicht direkt oder? 

    Wie sollte er die haben? Du musst schauen, dass Du das debuggen kannst. Tipps hierzu hast Du doch einige bekommen. Ohne das kann man dir nicht helfen. Wenn nicht mal eine Exception geworfen wird, woher soll man dann wissen, woher das kommt. Also bleibt dir nur der Weg, das zu debuggen.

    Falls dir die Mühe, deine Setupanwendung zu debuggen, zuviel ist, noch ein letzter Tipp: Bau den identischen Code in eine normale WinForms oder Konsolenanwendung und führ die auf dem XP Rechner aus. Die kannst Du dann debuggen. Falls es mit der aber funktioniert -> Debug deine Setupanwendung.

    BTW: Was steht denn in "strAppPath" auf dem XP und auf dem Win7 Rechner?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Dienstag, 19. Juni 2012 14:48
    Moderator
  • die pfade stimmen sowohl bei win 7 als auch bei win xp das hab ich überprüft, und genau das ist ja das seltsame daran.

    hab mir ne msg box gemach die mir den ganzen kram ausgibt.

    Dienstag, 19. Juni 2012 16:48
  • die pfade stimmen sowohl bei win 7 als auch bei win xp das hab ich überprüft, und genau das ist ja das seltsame daran.

    Dann gibt es keinen Fehler und alles ist, wie es sein soll.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 19. Juni 2012 17:15
    Moderator
  • Anstatt einer MessageBox ist es ratsam Debug.WriteLine("mein Text") zu nutzen. Deinen Code kannst du damit eigentlich zukleistern, da es nur mitbenutzt wird wenn du im Debug compilest.

    Die Nachrichten die geschrieben werden kannst du dann mit DebugView sehen -> http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx

    Mittwoch, 20. Juni 2012 05:03
  • hallo Ralf,

    aus den bisher geposteten Beitraegen ist mir nicht ersichtlich, was genau Dein Problem ist.

    Koenntest Du vielleicht einfach beschreiben, welches Problem Du hast und wie Du darauf kommst, dass Du unter Windows 7 und Windows XP unterschiedliches Verhalten hast.

    Hast Du sichergestellt, dass WinXP und Win7 vergleichbar konfiguriert sind, dh. 32-bit vs. 64-bit, local administrator, UAC etc.

    Ferner interessiert es mich, warum Du waehrend der Installation Zugriffsrechte fuer alle Dateien in einem Directory setzen musst. Durch das explizite Setzen der Permission auf den einzelnen Files gibt es Probleme wenn neue Dateien erstellt werden oder eine Applikation statt Modify eine Kopie der Datei erstellt und diese dann umbenennt denn dann hat sie nicht die notwendigen Berechtigungen - daher sollte die Berechtigungen auf dem Directory gesetzt werden.

    Kannst Du auch noch auffuehren, wo dieses Verzeichnis liegt.


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.


    Sonntag, 24. Juni 2012 09:42
  • genau da is das Problem, das is eine installer klasse, welche beim setup ausgeführt wird. da kann ich leider keinen breakpoint setzen 

    hallo Ralf,

    Du verwendest Visual Studio Setup Projekt Type und dieser wird ab VS2012 nicht mehr unterstuetzt und Du musst Dich dann nach einer anderen Setupttechnologie umschauen.

    Schau Dir kostenlose Wix Toolset an, welches eine XML Beschreibung des Setups in ein Windows Installer Paket (.MSI) kompiliert und sehr maechtig ist. Dessen groessten Nachteil ist das Fehlen eines GUI mit welchem die Dialog etc. erstellt werden  sondern alles erfolgt via XML - Du kannst es jedoch auch positiv sehen, da dann diese relativ einfach editiert (Textdatei) und auch verteilt entwickelt werden koennen.

    Mit Wix 3.6 RC kann jetzt auch relativ einfach mehrere MSI Paket nacheinander mit einem einzigen Setupprogramm installiert werden. (aehnlich einfach wie die vorkonfigurierten Prerequisites in VS2008/2010) wobei die fehlenden Pakete bei Bedarf runtergeladen werden koennen, z.b. .NET Runtime falls die benoetigte Version noch nicht installiert etc.

    Um auf Dein Problem zurueckzukommen, das Setzen der Permission der Dateien sollte nicht in einem .NET Assembly programmatisch erfolgen, da dies zu Probleme fuehren kann und Dein Code enthaelt keinen Support um die Aenderungen rueckgaengig zu machen, wenn die Installation rollbacked wird.

    Aus diesem Grunde sollte solche Aktionen deklarativ erfolgen - siehe Permission Table in .MSI - damit diese bei Bedarf auch wieder rueckgaengig gemacht werden koennen.


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    Sonntag, 24. Juni 2012 11:04
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 26. Juni 2012 08:53
    Moderator