title: Share folder with c# or cmd with all permissions
body: <p>I need to share a folder with <strong>read and write permissions</strong>.</p>
  
  <p>In windows 7 I am able to share it by executing:</p>
  
  <blockquote>
    <p>net share temp=A:\MySharedFolder /GRANT:Everyone,FULL</p>
  </blockquote>
  
  <p>If I execute the same code in windows xp it does not work. I can however execute:</p>
  
  <blockquote>
    <p>net share temp=C:\MySharedFolder </p>
  </blockquote>
  
  <p>but the folder will not be shared with full permissions. </p>
  
  <hr>
  
  <h2>EDIT</h2>
  
  <p>JotaBe posted a link and from that link I constructed the following program which seems to work.</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Runtime.InteropServices;
  
  namespace ConsoleApplication1
  {
      class Program
      {
  
          [DllImport("Netapi32.dll")]
          private static extern uint NetShareAdd(
              [MarshalAs(UnmanagedType.LPWStr)] string strServer,
              Int32 dwLevel,
              ref SHARE_INFO_502 buf,
              out uint parm_err
          );
  
          private enum NetError : uint
          {
              NERR_Success = 0,
              NERR_BASE = 2100,
              NERR_UnknownDevDir = (NERR_BASE + 16),
              NERR_DuplicateShare = (NERR_BASE + 18),
              NERR_BufTooSmall = (NERR_BASE + 23),
          }
  
          private enum SHARE_TYPE : uint
          {
              STYPE_DISKTREE = 0,
              STYPE_PRINTQ = 1,
              STYPE_DEVICE = 2,
              STYPE_IPC = 3,
              STYPE_TEMPORARY = 0x40000000,
              STYPE_SPECIAL = 0x80000000,
          }
  
          [StructLayout(LayoutKind.Sequential)]
          private struct SHARE_INFO_502
          {
              [MarshalAs(UnmanagedType.LPWStr)]
              public string shi502_netname;
              public SHARE_TYPE shi502_type;
              [MarshalAs(UnmanagedType.LPWStr)]
              public string shi502_remark;
              public Int32 shi502_permissions;
              public Int32 shi502_max_uses;
              public Int32 shi502_current_uses;
              [MarshalAs(UnmanagedType.LPWStr)]
              public string shi502_path;
              [MarshalAs(UnmanagedType.LPWStr)]
              public string shi502_passwd;
              public Int32 shi502_reserved;
              public IntPtr shi502_security_descriptor;
          }
  
  
          static void Main(string[] args)
          {
  
              string shareName = "testshare";
              string shareDesc = "This is a test share kekelar2000";
              string path = @"C:\MyShareDirectory"; // do not append comma, it'll fail
  
              SHARE_INFO_502 info = new SHARE_INFO_502();
              info.shi502_netname = shareName;
              info.shi502_type = SHARE_TYPE.STYPE_DISKTREE;
              info.shi502_remark = shareDesc;
              info.shi502_permissions = 0;   
              info.shi502_max_uses = -1;
              info.shi502_current_uses = 0;    
              info.shi502_path = path;
              info.shi502_passwd = null;       
              info.shi502_reserved = 0;
              info.shi502_security_descriptor = IntPtr.Zero;
  
              uint error = 0;
  
              uint result = NetShareAdd("192.168.0.120", 502, ref info, out error);
          }
      }
  }
  </code></pre>