Ordnerrechte einstellen


#1
Hallo

Ich muss da ein Programm schreiben, das mir einen Ordnerbaum durchsucht und im jeden Ordner/Unterordner die Rechte des Owners einstellt.

Das durchsuchen ist ja kein Problem, aber das einstellen der Rechte finde ich nicht heraus wie das funktionieren sollte.

Ich hoffe Ihr könnt mir da ein wenig weiter helfen.

mfg
 

mage

Erfahrenes Mitglied
#2
Ich denke das einfachste wäre es das Komandozeilenprogramm von Microsoft cacls über einen zusammengebauten Shellaufruf ausführen zu lassen,
 
#4
Ok...
Ich habe mir jetzt "cacls" mal angesehen. Das würde ja funktionieren.
Nur bekomme ich den gesammten befehl nicht auf die reihe. Ich habe ja auch schon was gefunden, aus dem werde ich aber nicht schlau.
 
Zuletzt bearbeitet:

mage

Erfahrenes Mitglied
#5
Wie man einen Shellaufruf macht oder das Tool ?
Cacls ist ein Tool von Microsoft für die Vergabe von Dateibenutzerrechten und wird schon seit NT4 mit ausgeliefert.
Wenn du in die Kommandozeile (DOS-Fenster) den Befehl eingibst bekommst du die Optionen angezeigt.
Damit lassen sich Dateizugriffsrechte von Benutzern oder Benutzergruppen wegnehmen, hinzufügen und verändern.

Für den Befehl hab ich gerade nur was in VB.Net gefunden im VB.NET Namespace
MSDN Shell Function

Den Namespace kannst du dir auch in ein C# Projekt einbinden.
Ich weiss aber nicht, ob das so die sauberste Möglichkeit ist, andere Programme aufzurufen, da laut Dokumentation - unmanged Code ausgeführt wird. Ich denke dort wird nur die Windows API gekapselt.
 
Zuletzt bearbeitet:
#6
Wie ich den befehl ausführe weis ich ja. Mir geht es in erster linie nur darum, wie ich die Rechte auf den gesammten Ordner legen kann.
Auf ein einziges File, das geht, aber auf den gesammten Ordner?

Code:
CACLS filename [/T] [ /E] [ /C] [/G user : perm] [/R user [...]]
               [/P user : perm [...]] [/D user [...]]

 --cut--

Abbreviations:
   CI - Container Inherit.
        The ACE will be inherited by directories.
   OI - Object Inherit.
        The ACE will be inherited by files.
   IO - Inherit Only.
        The ACE does not apply to the current file/directory.
Hier gibt es ein Abbreviations Namen CI. Wie geht das?
 

mage

Erfahrenes Mitglied
#8
Auf meinen PC bekomme ich die deutsch Hilfe:
Abkürzungen:
CI - Containervererbung.
Der ACE-Eintrag wird von Verzeichnissen geerbt.
OI - Objektvererbung.
Der ACE-Eintrag wird von Dateien geerbt.
IO - Nur vererben.
Der ACE-Eintrag bezieht sich nicht auf
die aktuelle Datei/das aktuelle Verzeichnis.
 
#9
Entschuldige bitte wenn ich mich ein weing blöd anstelle, aber ich werde aus den ganzen einfach nicht schlau...

Kann man die Rechte auf einen Ordner Programmtechnisch einstellen oder funktioniert das nur auf die darin befindlichen Datein?

Ich habe jetzt das ganze mal mit den Files probiert, dass ich die Rechte drauf setze, aber das funtzt auch nicht so richtig. Bei einigen Files setzt er die Rechte und bei einigen nicht. Aber egal...
Aber ich denke mal wenn der User nicht die nötigen rechte auf den ordner hat, dann werden ihm die Rechte auf die Files auch nichts helfen wenn er nicht auf den Ordner zugreifen kann. Oder reichen die Rechte auf die Files?

Und wenn es was mit den Ordner gibt, dann währe ich dir sehr verbunden, wenn du mir da ein kleines Beispiel Posten könntest.
 

mage

Erfahrenes Mitglied
#11
Grundlegen klappt die Rechtevergabe nur, wenn der Benutzer oder der Kontext des Programm der cacls ausführt auch das Recht besitzt, die Rechte dort zu verändern.
Das ist genau als wenn man es über den Explorer einstellt.

Man kann Rechte für Ordner vergeben und alle untergeordneten Dateien und Ordner, entweder die Rechte ersetzen oder vererben.

cacls <Ordnerpfad> /T /E /C /G <Benutzername>:F

<Ordnerpfad> ist der Pfad zum Ordner
<Benutzername> kann der Name des Benutzer oder der Benutzergruppe sein
/T führt die Operation für untergeordnete Dateien und Ordner durch
/E bearbeitet die Rechte, statt sie zu ersetzen - Ganz wichtig, da sonst die schon vorhanden Rechte entfernt werden
/C Sorgt dafür das bei einer Zugriffsverletzung, der Rest versucht wird zu setzen
/G steht für Rechte gewähren - dahinter kommt dann immer <Benutzername>:<Zugriffsrecht>

Zugriffrecht kann sein: N Kein
R Lesen
W Schreiben
C Ändern (Schreiben)
F Vollzugriff

Für weitere Optionen schau dir bitte die Hilfe von Cacls an.
 
#12
Danke.

Aber das mit cacls funktioniert so nicht. Ich habe volle Rechte auf den Ordner, aber es will einfach nicht so.

Ich habe es aber jetzt aber auf einen andere weg geschafft. Ich habe da eine methode gefunden, die genau das macht, was ich will.


Code:
		public static bool Set_File_Security(string Unser_Name, string path)
		{
			string strFile = path;
			try
			{
				ADsSecurityUtilityClass secuUtil = new ADsSecurityUtilityClass();
				object ob = secuUtil.GetSecurityDescriptor(
					strFile,
					(int)ActiveDs.ADS_PATHTYPE_ENUM.ADS_PATH_FILE,
					(int)ActiveDs.ADS_SD_FORMAT_ENUM.ADS_SD_FORMAT_IID);
				if (null != ob)
				{
					ActiveDs.IADsSecurityDescriptor sd =
						(IADsSecurityDescriptor)ob;
					ActiveDs.IADsAccessControlList obDacl =
						(ActiveDs.IADsAccessControlList)sd.DiscretionaryAcl;
					bool bAddAce = true;
					IEnumerator obAceEnum = obDacl.GetEnumerator();
					while (obAceEnum.MoveNext())
					{
						IADsAccessControlEntry obAce =
							(IADsAccessControlEntry)obAceEnum.Current;
						Console.WriteLine("Trustee: {0}", obAce.Trustee);
						// Check if User account is trustee of ACE or not.
						if (obAce.Trustee.IndexOf(@"Domain\"+Unser_Name) != -1)
						{
							// Check if this is a ALOWED Ace or not.
							if (obAce.AceType ==
								(int)ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED)
							{
								bAddAce = false;
							}
						}
					}

					// If bAddAce flag is set, then we will add it.
					if (bAddAce)
					{
						AccessControlEntryClass obNewAce =
							new AccessControlEntryClass();
						obNewAce.AceType =
							(int)ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;
						obNewAce.Trustee = @"Domain\"+Unser_Name;
						obNewAce.AccessMask = -1;
						obDacl.AddAce(obNewAce);
						sd.DiscretionaryAcl = obDacl;
						secuUtil.SetSecurityDescriptor(
							strFile,
							(int)ADS_PATHTYPE_ENUM.ADS_PATH_FILE,
							sd,
							(int)ADS_SD_FORMAT_ENUM.ADS_SD_FORMAT_IID);
					}
				}
				return true;
			}
			catch(Exception)
			{
				return false;
			}
		}
Mann muss nur das File C:\Windowns\System32\ActiveDs.lib einbinden und das war es.

Aber trotz dem Danke für deine Bemühungen! Ich werde mich noch etwas mit cacls bescheftigen. Villeicht bekomme ich es noch hin mit den.

mfg
 
#13
Siehe auch Besitzer und ACL , habe ein link zu einer C# library + 3 Beispiele gepostet.
Du mußt nur den Qellcode compelieren und zu den Assemblys hinzufügen.

Code:
using System;
using Microsoft.Win32.Security; // die compelierte Library

namespace Test
{
   public class TestSecurity
   {
      public static void SetFileAccessAllowed(string username, string path,
      	AccessType accessType)
      {
        //Security einlesen.
        using(SecurityDescriptor secDes = SecurityDescriptor.GetFileSecurity(path,
          SECURITY_INFORMATION.DACL_SECURITY_INFORMATION))
        {
               //Leere ACL erstellen.
               Dacl dacl = new Dacl();

               foreach(Ace ace in secDes.Dacl)
               {
                  //Berechtigung für den Benutzer ändern.
                  if(ace.Sid.AccountName == username)
                    dacl.AddAce(new AceAccessAllowed(ace.Sid,accessType, ace.Flags));
                  else //die Anderen Benutzer und Gruppen 1:1 übernehmen.
                    dacl.AddAce(new AceAccessAllowed(ace.Sid,ace.AccessType,ace.Flags));
               }

               //neue Berechtigungen Setzen.
               secDes.SetDacl(dacl);
               secDes.SetFileSecurity(path,
                 SECURITY_INFORMATION.DACL_SECURITY_INFORMATION);
          }
      }

      [STAThread]
      static void Main()
      {
         TestSecurity.SetFileAccessAllowed("Mustermann","C:\\Test",
             AccessType.STANDARD_RIGHTS_READ ^
             AccessType.STANDARD_RIGHTS_WRITE);
      }
   }
}
 
Zuletzt bearbeitet:
#14
Hallo

Es hat sich herausgestellt, dass der Fullaccess nicht reicht. Ich muss die OWNER ändern können. Ich habe da auch schon was in der MSDN gefunden, aber ich weis nicht, wie ich die verwenden sollte.

ADS_SECURITY_INFO_ENUM.ADS_SECURITY_INFO_OWNER; <- Reads or sets the owner data.

und

ADS_RIGHTS_ENUM.ADS_RIGHT_WRITE_OWNER; <-The right to assume ownership of the object.

Hat irgend wer von euch schon was davon gehört.

Und ich habe mir das obengenannte Forum man überflogen (das gesammt durchlesen dauert mir etwas zu lange, habe etwas Zeitdruck!). Hier werden meiner Meinung nach auch nur die Permissions und nicht die Owner verändert.

Ich hoffe ihr könnt mir helfen!

Und ich freue mich auf jede antwort.

mfg
 
Zuletzt bearbeitet:
#15
ok... vergest diese Frage, war wol etwas blöd.

Aber neue Frage.
Weis wer welche Reference ich einbinden muss, damit ich den Namespace "Microsoft.Win32.Security" verwenden kann?

Ich bedanke mich schon mal für jede Antwort die kommt.

mfg
 
#16
Das ist einfach, mit deiner IDE ein neues .lib Projekt namens Microsoft.Win32.Security erstellen. Die Klasse die von der IDE Erzeugt wird speichern, IDE Beenden. Danch die Class.cs mit dem Explorer löschen und die .cs Dateien von der Zipdatei aus dem verzeichnis v0.5_GotDotNet\Win32Security in dein Projektverzeichnis kopieren.
IDE wieder Starten und die .cs Dateien in das Projekt Microsoft.Win32.Security hinzufügen, einen Schlüssel erstellen mit sn -k sgKey.snk und
sn -p sgKey.snk publickey.snk. In AssemblyInfo.cs den eintrag AssemblyKeyFile ändern: [assembly: AssemblyKeyFile("sgKey.snk")] . Dann nach Compelieren mit der Einstellung Ausgabe (es dar nicht auf Debug stehen!) und Unsicheren Code zulassen. Die erzeugte DLL ins Verzeichnis D:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 kopieren und mit .NET Framework 1.1 Configuration im Assemblycache hinzufügen.

Danach kannst du die Microsoft.Win32.Security.dll ins Projekt importieren.
Jetzt stehen dir alle Klassen usw. aus dem namenspace Microsoft.Win32.Security zurverfügung.
 
Zuletzt bearbeitet: