Windows Freigabe (Share) erstellen und Berechtigungen zuweisen


Diese Tage habe ich eine kurze Recherche durchgeführt, wie man unter .NET eine Freigabe mit bestimmten Berechtigungen erstellt und habe dann das folgende Beispiel erstellt. Ich habe das Beispiel nicht in einer Domain testen können, sondern nur mit einem lokalen Benutzerkonto.

1. Anlegen einer Windows Freigabe

//Anlegen einer Freigabe auf dem lokalen Rechner
//Als erstes ein Verzeichnis anlegen.
Directory.CreateDirectory(@"C:\TestingFolder");

ManagementClass management = new ManagementClass("Win32_Share");
ManagementBaseObject input = management.GetMethodParameters("Create");
ManagementBaseObject output;

//Die Einstellungen für die Freigabe vornehmen
input["Description"] = "My Shared Folder";
input["Name"] = "My Shared Folder";
input["Path"] = @"C:\TestingFolder";
input["Type"] = 0x0; 

//Weitere Freigabetypen
// DISK_DRIVE = 0x0
// PRINT_QUEUE = 0x1
// DEVICE = 0x2
// IPC = 0x3
// DISK_DRIVE_ADMIN = 0x80000000
// PRINT_QUEUE_ADMIN = 0x80000001
// DEVICE_ADMIN = 0x80000002
// IPC_ADMIN = 0x8000003

//Anlegen der Freigabe
output = management.InvokeMethod("Create", input, null);
if ((uint)(output.Properties["ReturnValue"].Value) != 0)
{
    throw new Exception("Unable To Share The Directory");
 }
 else  {
     Console.WriteLine("Directory Successfully Shared");
 }

2. Zuweisen von Freigabeberechtigungen zu unserer Freigabe

Achtung, beim Zuweisen der Freigabeberechtigungen, gehen alle “alten” Freigabeberechtigungen verloren.

//Berechtigungen für die eben angelegte Freigabe setzten
//Anlegen der Freigabe für einen domainaccount
//NTAccount account = new NTAccount("domainname", "username");
//Anlegen der Freigabe für einen lokalen account
NTAccount account = new NTAccount("squadwuschel");
SecurityIdentifier sid = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));
byte[] sidArray = new byte[sid.BinaryLength];
sid.GetBinaryForm(sidArray, 0);

ManagementObject Trustee = new ManagementClass(new ManagementPath("Win32_Trustee"), null);
//Wenn das ganze für eine Domaine sein soll diese hier mit angeben
//Trustee["Domain"] = "domainname";
Trustee["Name"] = "squadwuschel";
Trustee["SID"] = sidArray;

ManagementObject AdminACE = new ManagementClass(new ManagementPath("Win32_Ace"), null);
AdminACE["AccessMask"] = 2032127;
AdminACE["AceFlags"] = 3;
AdminACE["AceType"] = 0;
AdminACE["Trustee"] = Trustee;

ManagementObject secDescriptor = new ManagementClass(new ManagementPath("Win32_SecurityDescriptor"), null);
secDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT
secDescriptor["DACL"] = new object[] { AdminACE };

//Den Pfad zum share angeben, den wir oben angelegt haben und den Namen des Shares angeben
ManagementObject share = new ManagementObject(@"\\squadwuschel-pc\root\cimv2:Win32_Share.Name='My Shared Folder'");
share.InvokeMethod("SetShareInfo", new object[] { Int32.MaxValue, "My Shared Folder", secDescriptor });

3. Quellen

http://howtoideas.net/how-to-create-a-shared-folder-using-c

http://blogs.msdn.com/b/helloworld/archive/2008/06/06/programmatically-configuring-permissions-on-a-share-in-c.aspx

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s