Hallo Ich habe folgendes Problem mit C#: Ich muss ein Programm schreiben, das mir Owner-Rechte auf gewisse Ordner setzt. Ich befinde mich in einer Domain und das Programm sollte auf einen Server ausgeführ werden und den ausgewählten Domainuser Owner-Rechte auf einen Ordner setzten der am Server liegt. Mein Problem ist es, dass ich nicht weis wie ich das mache. Wie setzte ich Ordnerpermissions programmtechnisch? Kann mir da jemand helfen. Ich danke schon mal für jede antwort. mfg
endweder über die ganze file-atribut-geschichte... oder quick and dirty über einen systemaufruf... unter c/c++ mit "system(blafasel)"
Dazu können folgende Funktionen aus der Win32API verwendet werden: Mit GetNamedSecurityInfo() kann die ACL eines Objektes bestimmt werden. Hier beispielsweise mit DWORD dwRes = 0; PACL pDACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; GetNamedSecurityInfo("c:\\blafusel", SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pDACL, NULL, &pSD); In diese ACL kann dann mit SetEntriesInAcl() ein EXPLICIT_ACCESS-Objekt eingebettet werden und die so erzeugte neue ACL kann wiederum mit SetNamedSecurityInfo() dem Objekt zugewiesen werden. So können zumindest Zugriffsrechte gesetzt werden - wie man ein bestimmtes Benutzerkonto zum Besitzer eines Objektes macht, entzieht sich momentan meiner Kenntnis. Beim Erzeugen eines Objektes ist das ja sowieso der Fall ... Es kann helfen, nach den Namen der von mir erwähnten Funktionen in der MSDN (http://msdn.microsoft.com) zu suchen - da finden sich dann auch mehr oder weniger erklärende Texte, die möglicherweise auch die spezifischen Probleme beleuchten.
Ok, danke für eure Antworten! Leider reicht mir der FullAccess auf einen Ordner nicht aus. Ich muss OWNER Rechte auf den Ordner vergeben können. Das mit den Access auf den Ordner habe bereits schon so glöst wie du es beschrieben hast. Funktioniert auch wunderbar! Die MSDN hat mir bei diesem Problem noch nit sehr viel geholfen. Ich habe zwar herausgefunden, dass es möglich ist OWNER Rechte zu vergeben, aber mehr steht in der MSDN auch nicht dirn. Zumindest die ausführung steht nicht drinn. Und ich kann mit der untenstehenden Code Zeile nicht besonders viel anfangen. Kannst du mir da villeicht unter die Arme greifen? 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. Ich hoffe ihr könnt mir helfen Und ich danke schon mal für eure Antworten mfg
"Owner rechte" - vielleicht liegt Dein Problem in genau dieser Formulierung. Der Besitz eines Objektes ist kein Recht, sondern eine Eigenschaft. Such' doch mal nach "take aobject ownership" oder ähnlichem. Dieser Suchstring wirft bei Google als ersten Treffer diesen Link aus: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/taking_object_ownership_in_c__.asp - und das klingt mir sehr nach dem, was Du anstellen möchtest. Möchtest Du aus einem Prozess heraus einem Objekt einen anderen Besitzer als den zuweisen, in dessen Konto der Prozess läuft, solltest Du Dich mit dem Thema "Impersonation" auseinandersetzen; damit kannst Du einen Thread in einem anderen Konto laufen lassen.
Danke das du mich auf das aufmerksam gemacht hast. Habe auch schon einiges darüber gefunden. Aber da habe ich noch ein Prblem, damit ich das verwenden kann. Entschuldige wenn ich etwas nerve, aber weist du was ich für eine Reference einbinden muss, damit ich den namespace "BlackBytes" verwenden kann? Der enthelt nämlich die Funktion "security.SetOwner". Und in der Beschreibung (die anscheinden schon etwas älter ist, sprich win9x) steht, dass man damit den OWNER einstellen kann.
Hallo!
> die anscheinden schon etwas älter ist, sprich win9x
Für Win9x kann das gar nicht sein, garantiert nicht. Ohne mir das
Beispiel angesehen zu haben: Mit der API-Funktion SetFileSecurity
kannst Du Dich doch ganz einfach als Owner eintragen (setzt voraus,
dass Du gemäss DACL das Recht WRITE_OWNER oder das Privilege
SeTakeOwnerShip enabled hast).
Was war jetzt eigentlich das Problem? Der Aufruf von API-Funktionen aus
C# heraus?
Der namespace "BlackBytes" ist mir im Übrigen nicht bekannt. Die MSDN
Library October 2004 hält sich ebnfalls bedeckt.
Ok... Auf SetFileSecurity bin ich auch schon gestoßen. Das ist aber eine Überarbeitete Funktion, die man nicht verwenden sollte. Statdessen sollte man SetNamedSecurityInfo verwenden. Nur gibt es hier auch ein kleines Problem! Ich weis nicht was ich für eine Reference ich einbinden muss um SetFileSecurity oder SetNamedSecurityInfo verwenden zu können. Ich habe es mal mit der vorgeschalgenen "dll"s, "lib"s und mit den "h" Files versucht. Aber es lassen sich keine von denen einbinden.
Für API-Calls gibt es das Interop-Zeugs, und da mußt Du selbst Hand anlegen. In etwa so: using System; using System.Runtime.InteropServices; namespace Security { public class Security { [DllImport("Advapi32.dll", EntryPoint="SetNamedSecurityInfoA", SetLastError=true, CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)] public static extern uint SetNamedSecurityInfo(/* Parameterliste */); } } Wie das jetzt aber mit den Pointern funktioniert, kann ich Dir leider auch nicht sagen. Da mußt Du mal ins Manual schauen.
Hallo Jetzt habe ich das Problem endlich gelöst. Der Namespace Microsoft.Win32.Security hat mir da stark weitergehlofen. Mit den da bereitgestellen Funktionen kann man Problemlos alles einstellen was sich um File Security handelt. Für den Namespace wird eine Dll benötigt. Das ist die "mmsseclib.dll", was auch im anhang befindet. Einfach ein SecuredObject und einen WindoofUser erstellen und schon kann man mit dem erstellten SecuredObject die nötigen permissions setzten. Ich danke euch für eure Unterstüzung! mfg
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.