Ordnerrechte einstellen

mage

Erfahrenes Mitglied
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.
 

Black_Deal

Mitglied
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
 

Shakaar

Grünschnabel
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:

Black_Deal

Mitglied
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:

Black_Deal

Mitglied
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
 

Shakaar

Grünschnabel
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: