jueves, 18 de noviembre de 2010

Compartir Carpeta Programáticamente C#

Hola a todos, ya tiene rato que no escribo ninguna entrada, así que hoy quiero agregar una de como compartir una carpeta programáticamente en C# (aunque el codigo es fácil de pasar a VB.NET).

Primero que nada empezamos creando una nueva aplicación de consola.

Después en Referencias agregamos una a "System.Management".

No olviden agregar la clausula Using al inicio de su programa (también agreguen una a System.IO, para verificar que el directorio exista):

using System.Management;
using System.IO;

Agregada la referencia y todo en orden, ahora si vamos a crear nuestra función para compartir la carpeta:

private static void CompartirFolder(string rutaFolder, string nombreCompartido, string descripcion)
        {
            try
            {
                if (Directory.Exists(rutaFolder))
                {
                    ManagementClass managementClass = new ManagementClass("Win32_Share");
                    ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
                    ManagementBaseObject outParams;
                    inParams["Description"] = descripcion;
                    inParams["Name"] = nombreCompartido;
                    inParams["Path"] = rutaFolder;
                    inParams["Type"] = 0x0;
                    inParams["MaximumAllowed"] = null;
                    inParams["Password"] = null;
                    inParams["Access"] = null;
                    outParams = managementClass.InvokeMethod("Create", inParams, null);
                    if ((uint)(outParams.Properties["ReturnValue"].Value) != 0)
                    {
                        throw new Exception("No se puede compartir la carpeta.");
                    }
                }
                else
                {
                    throw new DirectoryNotFoundException("No se encontro la carpeta a compartir");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

Una vez agregada nuestra función solo nos queda utilizarla, yo cree dos carpetas de prueba en mi disco duro.

static void Main(string[] args)
        {
            CompartirFolder("c:\\test1", "Prueba 1", "Prueba de compartir carpeta desde C-Sharp");
            CompartirFolder("c:\\test2", "Prueba 2", "Prueba de compartir carpeta desde C-Sharp");
        }

Después de correr el programa verificamos las propiedades de nuestras carpetas y veremos que han quedado compartidas.
NOTA: Como pueden darse cuenta la carpeta queda compartida con Full Control para Todos los usuarios, ya en otro post veremos cómo asignar permisos a diferentes usuarios.

Saludos y hasta la próxima.

5 comentarios:

pakitosans dijo...

Hola Alberto, muy buen aporte...solo eh tenido un pekeño detalle...mira, al parecer si realiza todo bien pero al momento de tratar de accesar desde otro ekipo de la red me dice ke no tiene acceso a la ruta especificada... si se ve la karpeta compartida,pero no puedo accesar a ella.. podrias ayudarme...

axy108 dijo...

Hola pakitosans, al parecer el problema que estas teniendo es con la seguridad en tu equipo donde esta tu carpeta compartida. Con este codigo compartimos la carpeta (es por eso que ya la puedes ver en carpetas compartidas) pero aun asi hay que asignar permisos en el tab de seguridad de la carpeta para que se pueda acceder a ella. Revisa este link para mas info http://msdn.microsoft.com/en-us/library/system.security.permissions.fileiopermission.aspx. Saludos.

pakitosans dijo...

hola de nuevo... andube buskando en algunos lados y utilicé algo así... de esta forma se puede poner más permisos y restricciones...

DirectoryInfo dirInfo = new DirectoryInfo(pathFolder);

DirectorySecurity dirSecurity = dirInfo.GetAccessControl();

dirSecurity.AddAccessRule(new FileSystemAccessRule(@"Todos", FileSystemRights.FullControl, AccessControlType.Allow ));

ó

dirSecurity.AddAccessRule(new FileSystemAccessRule(@"Todos", FileSystemRights.FullControl, AccessControlType.Deny));

[..se pueden poner más permisos..]

dirInfo.SetAccessControl(dirSecurity);

Bueno, de todas maneras te agradesko ke me kontestaras y de algo me ayudará el link ke me akavas de pasar...me ayudará a reforzar este punto, ke en lo ke haré si es algo delikado... muchas gracias y muy buenas publikaciones...

ranfe dijo...

Amigo se que es un poco viejo pero me gustaria saber de donde tomas esta clase:
ManagementClass

Me urge saberlo :) saludos, gran post

axy108 dijo...

Necesitas agregar una Referencia a System.Management y luego en la parte superior de tu clase agregar una referencia con un using. Checa. la primer parte del post ahí lo explica. Saludos