110,535
社区成员
发帖
与我相关
我的任务
分享
public enum MethodStatus : uint
{
Success = 0, //Success
AccessDenied = 2, //Access denied
UnknownFailure = 8, //Unknown failure
InvalidName = 9, //Invalid name
InvalidLevel = 10, //Invalid level
InvalidParameter = 21, //Invalid parameter
DuplicateShare = 22, //Duplicate share
RedirectedPath = 23, //Redirected path
UnknownDevice = 24, //Unknown device or directory
NetNameNotFound = 25 //Net name not found
}
public enum ShareType : uint
{
DiskDrive = 0x0, //Disk Drive
PrintQueue = 0x1, //Print Queue
Device = 0x2, //Device
IPC = 0x3, //IPC
DiskDriveAdmin = 0x80000000, //Disk Drive Admin
PrintQueueAdmin = 0x80000001, //Print Queue Admin
DeviceAdmin = 0x80000002, //Device Admin
IpcAdmin = 0x80000003 //IPC Admin
}
public enum AccessPrivileges : uint
{
/// <summary>
/// 列出文件夹/读取数据
/// </summary>
FILE_READ_DATA = 0x00000001,
/// <summary>
/// 创建文件/写入数据
/// </summary>
FILE_WRITE_DATA = 0x00000002,
/// <summary>
/// 创建文件夹/附加数据
/// </summary>
FILE_APPEND_DATA = 0x00000004,
/// <summary>
/// 读取扩展属性
/// </summary>
FILE_READ_EA = 0x00000008,
/// <summary>
/// 写入扩展属性
/// </summary>
FILE_WRITE_EA = 0x00000010,
/// <summary>
/// 遍历文件夹/执行文件
/// </summary>
FILE_EXECUTE = 0x00000020,
/// <summary>
/// 删除子文件夹及文件
/// </summary>
FILE_DELETE_CHILD = 0x00000040,
/// <summary>
/// 读取属性
/// </summary>
FILE_READ_ATTRIBUTES = 0x00000080,
/// <summary>
/// 写入属性
/// </summary>
FILE_WRITE_ATTRIBUTES = 0x00000100,
/// <summary>
/// 删除
/// </summary>
DELETE = 0x00010000,
/// <summary>
/// 读取权限
/// </summary>
READ_CONTROL = 0x00020000,
/// <summary>
/// 更改权限
/// </summary>
WRITE_DAC = 0x00040000,
/// <summary>
/// 取得所有权
/// </summary>
WRITE_OWNER = 0x00080000,
/// <summary>
/// 无任何权限
/// </summary>
SYNCHRONIZE = 0x00100000,
/// <summary>
/// 所有权限
/// </summary>
Full = AccessPrivileges.DELETE | AccessPrivileges.FILE_APPEND_DATA | AccessPrivileges.FILE_DELETE_CHILD | AccessPrivileges.FILE_EXECUTE
| AccessPrivileges.FILE_READ_ATTRIBUTES | AccessPrivileges.FILE_READ_DATA | AccessPrivileges.FILE_READ_EA | AccessPrivileges.FILE_WRITE_ATTRIBUTES
| AccessPrivileges.FILE_WRITE_DATA | AccessPrivileges.FILE_WRITE_EA | AccessPrivileges.READ_CONTROL | AccessPrivileges.SYNCHRONIZE
| AccessPrivileges.WRITE_DAC | AccessPrivileges.WRITE_OWNER
}
enum AceFlags : uint
{
NonInheritAce = 0,
ObjectInheritAce = 1,
ContainerInheritAce = 2,
NoPropagateInheritAce = 4,
InheritOnlyAce = 8,
InheritedAce = 16
}
[Flags]
enum AceType : uint
{
AccessAllowed = 0,
AccessDenied = 1,
Audit = 2
}
public class UserPrivileges
{
public string UserAccount { get; set; }
public List<String> Privileges { get; set; }
public string Domain { get; set; }
public object ObjPrivileges
{
get;
set;
}
}
public class ShareHelper
{
static string[] filedesc = {"FILE_READ_DATA", "FILE_WRITE_DATA", "FILE_APPEND_DATA", "FILE_READ_EA",
"FILE_WRITE_EA", "FILE_EXECUTE", "FILE_DELETE_CHILD", "FILE_READ_ATTRIBUTES",
"FILE_WRITE_ATTRIBUTES", " ", " ", " ",
" ", " ", " ", " ",
"DELETE ", "READ_CONTROL", "WRITE_DAC", "WRITE_OWNER",
"SYNCHRONIZE ", " ", " "," ",
"ACCESS_SYSTEM_SECURITY", "MAXIMUM_ALLOWED", " "," ",
"GENERIC_ALL", "GENERIC_EXECUTE", "GENERIC_WRITE","GENERIC_READ"};
private ManagementObject mWinShareObject;
private ShareHelper(ManagementObject obj) { mWinShareObject = obj; }
#region Wrap Win32_Share properties
public uint AccessMask
{
get { return Convert.ToUInt32(mWinShareObject["AccessMask"]); }
}
public bool AllowMaximum
{
get { return Convert.ToBoolean(mWinShareObject["AllowMaximum"]); }
}
public string Caption
{
get { return Convert.ToString(mWinShareObject["Caption"]); }
}
public string Description
{
get { return Convert.ToString(mWinShareObject["Description"]); }
}
public DateTime InstallDate
{
get { return Convert.ToDateTime(mWinShareObject["InstallDate"]); }
}
public uint MaximumAllowed
{
get { return Convert.ToUInt32(mWinShareObject["MaximumAllowed"]); }
}
public string Name
{
get { return Convert.ToString(mWinShareObject["Name"]); }
}
public string Path
{
get { return Convert.ToString(mWinShareObject["Path"]); }
}
public string Status
{
get { return Convert.ToString(mWinShareObject["Status"]); }
}
public ShareType Type
{
get { return (ShareType)Convert.ToUInt32(mWinShareObject["Type"]); }
}
#endregion
#region Wrap Methods
/// <summary>
/// 删除共享
/// </summary>
/// <returns></returns>
public MethodStatus Delete()
{
object result = mWinShareObject.InvokeMethod("Delete", new object[] { });
uint r = Convert.ToUInt32(result);
return (MethodStatus)r;
}
/// <summary>
/// 创建共享
/// </summary>
/// <param name="path"></param>
/// <param name="name"></param>
/// <param name="type"></param>
/// <param name="maximumAllowed"></param>
/// <param name="description"></param>
/// <param name="password"></param>
/// <returns></returns>
public static MethodStatus Create(string path, string name, ShareType type, uint maximumAllowed, string description, string password)
{
ManagementClass mc = new ManagementClass("Win32_Share");
object[] parameters = new object[] { path, name, (uint)type, maximumAllowed, description, password, null };
object result = mc.InvokeMethod("Create", parameters);
uint r = Convert.ToUInt32(result);
return (MethodStatus)r;
}
#endregion
public static IList<ShareHelper> GetAllShares()
{
IList<ShareHelper> result = new List<ShareHelper>();
ManagementClass mc = new ManagementClass("Win32_Share");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
ShareHelper share = new ShareHelper(mo);
result.Add(share);
}
return result;
}
public static ShareHelper GetNamedShare(string name)
{
// Not a very efficient implementation obviously, but heck... This is sample code. ;)
IList<ShareHelper> shares = GetAllShares();
foreach (ShareHelper s in shares)
if (s.Name == name)
return s;
return null;
}
public static MethodStatus SetPrivileges(string path, List<UserPrivileges> listPrivilege)
{
ManagementObject mo = new ManagementObject(string.Format("Win32_LogicalFileSecuritySetting.Path='{0}'", path));
ManagementBaseObject outParams = mo.InvokeMethod("GetSecurityDescriptor", null, null);
if ((uint)outParams.Properties["ReturnValue"].Value != 0)
{
return MethodStatus.NetNameNotFound;
}
ManagementBaseObject Descriptor = (ManagementBaseObject)outParams.Properties["Descriptor"].Value;
List<ManagementBaseObject> newDacl = new List<ManagementBaseObject>();
foreach (UserPrivileges up in listPrivilege)
{
ManagementClass trustee = new ManagementClass("win32_trustee");
trustee.Properties["Name"].Value = up.UserAccount;
trustee.Properties["Domain"].Value = null;
ManagementClass ace = new ManagementClass("win32_ace");
ace.Properties["AccessMask"].Value = up.ObjPrivileges; //AccessPrivileges.FileReadData | AccessPrivileges.FileReadAttributes | AccessPrivileges.FileReadEA
//| AccessPrivileges.ReadControl | AccessPrivileges.FileExecute;
ace.Properties["AceFlags"].Value = AceFlags.ObjectInheritAce | AceFlags.ContainerInheritAce | AceFlags.NoPropagateInheritAce;
ace.Properties["AceType"].Value = AceType.AccessAllowed;
ace.Properties["Trustee"].Value = trustee;
newDacl.Add(ace);
}
ManagementBaseObject inParams = mo.GetMethodParameters("SetSecurityDescriptor");
Descriptor.Properties["Dacl"].Value = newDacl.ToArray();
inParams["Descriptor"] = Descriptor;
ManagementBaseObject ret = mo.InvokeMethod("SetSecurityDescriptor", inParams, null);
uint returnValue = (uint)ret.Properties["ReturnValue"].Value;
return (MethodStatus)returnValue;
}
public static List<UserPrivileges> GetPrivileges(string path)
{
List<UserPrivileges> list = new List<UserPrivileges>();
ManagementPath mPath = new ManagementPath();
mPath.Server = ".";
mPath.NamespacePath = @"root\cimv2";
mPath.RelativePath = @"Win32_LogicalFileSecuritySetting.Path='" + path + "'"; // using tmp as folder name
ManagementObject lfs = new ManagementObject(mPath);
ManagementBaseObject outParams = lfs.InvokeMethod("GetSecurityDescriptor", null, null);
if (((uint)(outParams.Properties["ReturnValue"].Value)) == 0)
{
ManagementBaseObject Descriptor = ((ManagementBaseObject)(outParams.Properties["Descriptor"].Value));
ManagementBaseObject[] DaclObject = ((ManagementBaseObject[])(Descriptor.Properties["Dacl"].Value));
foreach (ManagementBaseObject mbo in DaclObject)
{
UserPrivileges up = new UserPrivileges();
ManagementBaseObject Trustee = ((ManagementBaseObject)(mbo["Trustee"]));
up.Domain = Trustee.Properties["Domain"].Value == null ? "" : Trustee.Properties["Domain"].Value.ToString();
up.UserAccount = Trustee.Properties["Name"].Value.ToString();
UInt32 mask = (UInt32)mbo["AccessMask"];
int[] m = { (int)mask };
BitArray ba = new BitArray(m);
int i = 0;
IEnumerator baEnum = ba.GetEnumerator();
up.Privileges = new List<string>();
while (baEnum.MoveNext())
{
if ((bool)baEnum.Current)
up.Privileges.Add(filedesc[i].Trim());
i++;
}
list.Add(up);
}
}
List<UserPrivileges> listNew = new List<UserPrivileges>();
foreach (var up in list)
{
UserPrivileges upNew=listNew.Where(x => x.UserAccount == up.UserAccount).FirstOrDefault();
if (upNew!=null)
{
upNew.Privileges.AddRange(up.Privileges);
upNew.Privileges=upNew.Privileges.Distinct().ToList();
}
else
{
listNew.Add(up);
}
}
return listNew; ;
}
}