您的位置:首页 > 理论基础 > 计算机网络

C#中使用网络函数 (第一部分 用户函数)[翻译]

2004-12-26 15:58 447 查看
作者:Michael Bright

原文:http://www.csharphelp.com/archives2/archive439.html

本文将着重介绍Win32 API库中涉及网络管理的函数。首先我要讲一讲在.Net框架中管理用户的两个方法,第一种是Active
Directory方法,这种方法要求你安装Active Directory。如果你打算管理一个小网络上的用户,或者一个未安装Active
Directory的独立工作站,为了管理用户而安装Active
Directory显得有些不值得。另外一种方法则是这篇文章所要讲到的——使用Win32 API库函数。在这篇文章中,我将介绍如何使用C#
添加、删除和修改用户和组,以及如何查询一个主机或网络的用户和网络信息。我们将用到以下函数

NetUserAdd

NetUserDel

NetUserGetInfo

NetUserSetInfo

NetUserChangePassword

NetUserEnum

NetUserGetLocalGroups

初始化

首先,正如许多C#开发者都知道的,我们要引入InteropServices名字空间到我们的工程中,以便能够访问dll中的函数。这可以通过如下的代码片断实现:

///// 代码片断 1.0

using System.Runtime.InteropServices;

//// 代码结束

一旦我们拥有了访问权限,我们就可以将dll中的函数声明引入,我们将使用方法和结构体来关联它们。函数调用将在下面讨论:

使用C#添加一个用户

在网络函数中最重要的操作之一就是向一个网络或计算机添加一个用户。要通过C#添加一个用户,我们需要使用NetAddUser函数,该函数允许
我们添加用户到特定的计算机,如果我们将servername置空,用户将被添加到本地计算机。在下面的代码片断中,我们将看到如何声明和使用
NetUserAdd函数。我们在使用该函数前,需要定义一个结构体USER_INFO_1,来作为NetUserAdd的参数。

///// 代码片断 1.1 声明

[DllImport("Netapi32.dll")]

extern static int NetUserAdd([MarshalAs(UnmanagedType.LPWStr)] string servername, int level, ref USER_INFO_1 buf, int parm_err);

//// 代码结束

在使用代码时,你要注意到一点——尽管使用了最后一个int参数,你不需要知道返回的错误值。如果你一定要了解错误,需要修改代码。既然我们已经声明了我们要使用的外部API,我们应该声明结构体了。

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]

public struct
[b] USER_INFO_1

USER_INFO_1 NewUser = new USER_INFO_1(); // Create an new instance of the USER_INFO_1 struct

NewUser.usri1_name = "UserTestOne"; // 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 = "My First User Made through C#"; // Comment on the User

NewUser.usri1_script_path = null; // We didn't supply a Logon Script Path

if(NetUserAdd(null ,1 ,ref NewUser, 0)!=0) // If the call fails we get a non-zero value

[DllImport("Netapi32.dll")]

extern static int NetUserDel([MarshalAs(UnmanagedType.LPWStr)] string servername, [MarshalAs(UnmanagedType.LPWStr)] string username);

if(NetUserDel(null ,"UserTestOne")!=0) // If the call fails we get a non-zero value

[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);

IntPtr bufPtr;

USER_INFO_1 User = new USER_INFO_1();

if(NetUserGetInfo(null, "Administrator",1,out bufPtr)!=0)

User = (USER_INFO_1)Marshal.PtrToStructure(bufPtr, typeof(USER_INFO_1));

MessageBox.Show("Users Name: " + User.usri1_name + " Users Comments: " + User.comment + " Users Privilege Level: " + User.usri1_priv);

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(null, "UserTestOne",1,ref Update,0)!=0)

[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);

if(NetUserChangePassword(null, "UserTestOne", "password", "ournewpassword")!=0)

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]

public struct USER_INFO_0

[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);

一旦我们进行了声明,我们就可以使用如下代码片断获得用户列表。

int EntriesRead;

int TotalEntries;

int Resume;

IntPtr bufPtr;

NetUserEnum(null, 0, 2, out bufPtr, -1, out EntriesRead, out TotalEntries, out Resume);

if(EntriesRead> 0)

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]

public struct LOCALGROUP_USERS_INFO_0

[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);

int EntriesRead;

int TotalEntries;

IntPtr bufPtr;

NetUserGetLocalGroups(null, "Administrator",0,0,out bufPtr,1024,out EntriesRead, out TotalEntries);

if(EntriesRead> 0)

/**///// 代码结束

上面的例子返回用户Administrator所在的组。通过本文,我们了解了如何通过.Net平台调用方法使用与管理用户相关的网络函数。关于原作者[见原文]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: