(转)如何使用.NET操作本地用户组和用户
时间:2010-12-14 来源:神一样的疯子
[DllImport("Netapi32.dll")]
extern static int NetLocalGroupAdd([MarshalAs(UnmanagedType.LPWStr)] string servername, int level, ref LOCALGROUP_INFO_1 buf, int parm_err);
[DllImport("Netapi32.dll")]
extern static int NetLocalGroupAddMembers([MarshalAs(UnmanagedType.LPWStr)] string servername,[MarshalAs(UnmanagedType.LPWStr)] string groupname,
int level, ref LOCALGROUP_MEMBERS_INFO_3 buf, int totalentries);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct LOCALGROUP_MEMBERS_INFO_3
{
public string domainandname; //<DomainName>\<AccountName> //lgrmi3_domainandname
}
[DllImport("Netapi32.dll")]
extern static int NetUserDel([MarshalAs(UnmanagedType.LPWStr)] string servername, [MarshalAs(UnmanagedType.LPWStr)] string username);
[DllImport("Netapi32.dll")]
extern static int NetUserGetInfo([MarshalAs(UnmanagedType.LPWStr)] string servername,[MarshalAs(UnmanagedType.LPWStr)] string username,int level,out IntPtr bufptr);
[DllImport("Netapi32.dll")]
extern static int NetUserSetInfo([MarshalAs(UnmanagedType.LPWStr)] string servername,[MarshalAs(UnmanagedType.LPWStr)] string username,int level,ref USER_INFO_1 buf, int error);
[DllImport("Netapi32.dll")]
extern static int NetUserChangePassword([MarshalAs(UnmanagedType.LPWStr)] string domainname,[MarshalAs(UnmanagedType.LPWStr)] string username,[MarshalAs(UnmanagedType.LPWStr)] string oldpassword,[MarshalAs(UnmanagedType.LPWStr)] string newpassword);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct USER_INFO_0
{
public String Username;
}
[DllImport("Netapi32.dll")]
extern static int NetUserEnum([MarshalAs(UnmanagedType.LPWStr)] string servername, int level, int filter, out IntPtr bufptr, int prefmaxlen, out int entriesread, out int totalentries, out int resume_handle);
[DllImport("Netapi32.dll")]
extern static int NetApiBufferFree(IntPtr Buffer);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct LOCALGROUP_USERS_INFO_0
{
public string groupname;
}
[DllImport("Netapi32.dll")]
public extern static int NetUserGetLocalGroups([MarshalAs(UnmanagedType.LPWStr)] string servername,[MarshalAs(UnmanagedType.LPWStr)] string username, int level, int flags, out IntPtr bufptr, int prefmaxlen, out int entriesread, out int totalentries);
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct USER_INFO_1
{
public string usri1_name;
public string usri1_password;
public int usri1_password_age;
public int usri1_priv;
public string usri1_home_dir;
public string comment;
public int usri1_flags;
public string usri1_script_path;
}
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct LOCALGROUP_INFO_1
{
public string grpi1_name;
public string grpi1_comment;
}
/// <summary>
/// 添加一个用户,添加失败后返回非0 。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <param name="strComment"></param>
public void AddUser(string serverName,string userName,string password,string strComment)
{
USER_INFO_1 NewUser = new USER_INFO_1(); //创建一个USER_INFO_1实例
NewUser.usri1_name = userName; // Allocates the username
NewUser.usri1_password = password; // allocates the password
NewUser.usri1_priv = 1; // Sets the account type to USER_PRIV_USER
NewUser.usri1_home_dir = null; // We didn't supply a Home Directory
NewUser.comment = strComment; // Comment on the User
NewUser.usri1_script_path = null; // We didn't supply a Logon Script Path
if(NetUserAdd(serverName,1 ,ref NewUser, 0)!=0) //添加失败后返回非0
{
MessageBox.Show("Error Adding User","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
/// <summary>
/// 添加一个用户,添加失败后返回非0 。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="groupName"></param>
/// <param name="strComment"></param>
public void AddGroup(string serverName,string groupName,string strComment)
{
LOCALGROUP_INFO_1 NewGroup=new LOCALGROUP_INFO_1();
NewGroup.grpi1_name=groupName;
NewGroup.grpi1_comment=strComment;
if(NetLocalGroupAdd(serverName,1 ,ref NewGroup, 0)!=0) //添加失败后返回非0
{
MessageBox.Show("Error Adding Group","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
/// <summary>
/// 在本地组中添加一个用户成员,添加失败后返回非0 。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="groupName"></param>
/// <param name="strComment"></param>
public void GroupAddMembers(string serverName,string groupName,string userName)
{
LOCALGROUP_MEMBERS_INFO_3 NewMember=new LOCALGROUP_MEMBERS_INFO_3();
NewMember.domainandname=userName;
if(NetLocalGroupAddMembers(serverName,groupName,3 ,ref NewMember, 1)!=0) //添加失败后返回非0
{
MessageBox.Show("Error Adding Group Member","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
/// <summary>
/// 删除一个用户,同时将删除这个用户在任何组中的关系,删除失败后返回非0。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="userName"></param>
public void RemoveUser(string serverName,string userName)
{
if(NetUserDel(serverName ,userName)!=0) //删除失败后返回非0
{
MessageBox.Show("Error Removing User","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
/// <summary>
/// 获取一个用户的信息,失败后返回非0。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="userName"></param>
public void GetUserInfo(string serverName,string userName)
{
IntPtr bufPtr;
USER_INFO_1 User = new USER_INFO_1();
if(NetUserGetInfo(serverName, userName,1,out bufPtr)!=0)
{
MessageBox.Show("Error Getting User Info","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
User = (USER_INFO_1)Marshal.PtrToStructure(bufPtr, typeof(USER_INFO_1));
MessageBox.Show("Users Name: " + User.usri1_name + "\nUsers Comments: " + User.comment + "\nUsers Privilege Level: " + User.usri1_priv + "\nUsers flags: " + User.usri1_flags+ "\nUsers home dir: " + User.usri1_home_dir);
}
/// <summary>
/// 修改一个用户,失败后返回非0。这儿我只做了简的测试,如果要修改用户更多的信息,请伟明加上其它信息。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="userName"></param>
public void ModifyUser(string serverName,string userName)
{
USER_INFO_1 Update = new USER_INFO_1();
Update.comment = "This is Our C# Updated Comment";
//Update.usri1_priv = 2; // Note that this can only be obtained programmatically using NetUserGetInfo
if(NetUserSetInfo(serverName, userName,1,ref Update,0)!=0)
{
MessageBox.Show("Error Setting User Info","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
/// <summary>
/// 修改一个用户的密码,失败后返回非0。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="userName"></param>
public void ModifyUserPassword(string serverName,string userName,string oldPassword,string newPassword)
{
if(NetUserChangePassword(serverName, userName, oldPassword, newPassword)!=0)
{
MessageBox.Show("Error Changing User Password","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
/// <summary>
/// 获取机器上所有的用户信息。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
public void GetAllUserInfo(string serverName)
{
int EntriesRead;
int TotalEntries;
int Resume;
IntPtr bufPtr;
NetUserEnum(serverName, 0, 2, out bufPtr, -1, out EntriesRead, out TotalEntries, out Resume);
if(EntriesRead> 0)
{
USER_INFO_0[] Users = new USER_INFO_0[EntriesRead];
IntPtr iter = bufPtr;
for(int i=0; i < EntriesRead; i++)
{
Users[i] = (USER_INFO_0)Marshal.PtrToStructure(iter, typeof(USER_INFO_0));
iter = (IntPtr)((int)iter + Marshal.SizeOf(typeof(USER_INFO_0)));
MessageBox.Show(Users[i].Username);
}
NetApiBufferFree(bufPtr);
}
}
/// <summary>
/// 获取机器上某用户所属于的本地组信息。
/// </summary>
/// <param name="serverName">机器名称,如果是本机,请设置为null</param>
/// <param name="userName"></param>
public void UserInLocalGroups(string serverName,string userName)
{
int EntriesRead;
int TotalEntries;
IntPtr bufPtr;
NetUserGetLocalGroups(serverName, userName,0,0,out bufPtr,1024,out EntriesRead, out TotalEntries);
if(EntriesRead> 0)
{
LOCALGROUP_USERS_INFO_0[] RetGroups = new LOCALGROUP_USERS_INFO_0[EntriesRead];
IntPtr iter = bufPtr;
for(int i=0; i < EntriesRead; i++)
{
RetGroups[i] = (LOCALGROUP_USERS_INFO_0)Marshal.PtrToStructure(iter, typeof(LOCALGROUP_USERS_INFO_0));
iter = (IntPtr)((int)iter + Marshal.SizeOf(typeof(LOCALGROUP_USERS_INFO_0)));
MessageBox.Show(RetGroups[i].groupname);
}
NetApiBufferFree(bufPtr);
}
}
}
}