Forum: PC-Programmierung Ordner Rechte Einstellen


von Black_Deal (Gast)


Lesenswert?

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

von KoF (Gast)


Lesenswert?

endweder über die ganze file-atribut-geschichte...

oder quick and dirty über einen systemaufruf...
unter c/c++ mit "system(blafasel)"

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Black_Deal (Gast)


Lesenswert?

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

von Rufus T. Firefly (Gast)


Lesenswert?

"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.

von Black_Deal (Gast)


Lesenswert?

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.

von René König (Gast)


Lesenswert?

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.

von Black_Deal (Gast)


Lesenswert?

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.

von René König (Gast)


Lesenswert?

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.

von Black_Deal (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.