我想从计算机管理 - >共享文件夹 - >会话选项卡中将关于连接的网络用户的数据提取到我的c#应用程序中。任何人都可以指导我使用哪些名称空间以及一些示例代码,以从计算机管理 - >共享文件夹 - >会话选项卡导入用户名和IP地址?枚举网络会话
问候
我想从计算机管理 - >共享文件夹 - >会话选项卡中将关于连接的网络用户的数据提取到我的c#应用程序中。任何人都可以指导我使用哪些名称空间以及一些示例代码,以从计算机管理 - >共享文件夹 - >会话选项卡导入用户名和IP地址?枚举网络会话
问候
你不想与计算机管理互动,你怎么称呼它同样的功能,减少中间人圈外。
对于发现关于当前的网络连接,你可能会寻找WNetOpenEnum或NetConnectionEnum
我不认为有一个在BCL此一个.NET函数,你必须使用的P/Invoke或寻找一个第三方库(或我个人最喜欢的,用C++/CLI写一个包装)
你想NetSessionEnum,其中:
提供有关在服务器上建立的会话信息。
当传递的502水平,它会返回一个数组:
...的计算机的名称;用户名称;打开计算机上的文件,管道和设备;以及客户正在使用的运输工具的名称。
幸运的是,pinvoke.net有necessary signatures甚至一些示例代码。这里有一个全功能的示例:
public class Program {
public void Main(string[] args) {
IntPtr pSessionInfo;
IntPtr pResumeHandle = IntPtr.Zero;
UInt32 entriesRead, totalEntries;
var netStatus = NativeMethods.NetSessionEnum(
null, // local computer
null, // client name
null, // username
502, // include all info
out pSessionInfo, // pointer to SESSION_INFO_502[]
NativeMethods.MAX_PREFERRED_LENGTH,
out entriesRead,
out totalEntries,
ref pResumeHandle
);
try {
if (netStatus != NativeMethods.NET_API_STATUS.NERR_Success) {
throw new InvalidOperationException(netStatus.ToString());
}
Console.WriteLine("Read {0} of {1} entries", entriesRead, totalEntries);
for (int i = 0; i < entriesRead; i++) {
var pCurrentSessionInfo = new IntPtr(pSessionInfo.ToInt32() + (NativeMethods.SESSION_INFO_502.SIZE_OF * i));
var s = (NativeMethods.SESSION_INFO_502)Marshal.PtrToStructure(pCurrentSessionInfo, typeof(NativeMethods.SESSION_INFO_502));
Console.WriteLine(
"User: {0}, Computer: {1}, Type: {2}, # Open Files: {3}, Connected Time: {4}s, Idle Time: {5}s, Guest: {6}",
s.sesi502_username,
s.sesi502_cname,
s.sesi502_cltype_name,
s.sesi502_num_opens,
s.sesi502_time,
s.sesi502_idle_time,
s.sesi502_user_flags == NativeMethods.SESSION_INFO_502_USER_FLAGS.SESS_GUEST
);
}
} finally {
NativeMethods.NetApiBufferFree(pSessionInfo);
}
}
}
public sealed class NativeMethods {
[DllImport("netapi32.dll", SetLastError=true)]
public static extern NET_API_STATUS NetSessionEnum(
string serverName,
string uncClientName,
string userName,
UInt32 level,
out IntPtr bufPtr,
int prefMaxLen,
out UInt32 entriesRead,
out UInt32 totalEntries,
ref IntPtr resume_handle
);
[DllImport("netapi32.dll")]
public static extern uint NetApiBufferFree(IntPtr Buffer);
public const int MAX_PREFERRED_LENGTH = -1;
public enum NET_API_STATUS : uint {
NERR_Success = 0,
NERR_InvalidComputer = 2351,
NERR_NotPrimary = 2226,
NERR_SpeGroupOp = 2234,
NERR_LastAdmin = 2452,
NERR_BadPassword = 2203,
NERR_PasswordTooShort = 2245,
NERR_UserNotFound = 2221,
ERROR_ACCESS_DENIED = 5,
ERROR_NOT_ENOUGH_MEMORY = 8,
ERROR_INVALID_PARAMETER = 87,
ERROR_INVALID_NAME = 123,
ERROR_INVALID_LEVEL = 124,
ERROR_MORE_DATA = 234 ,
ERROR_SESSION_CREDENTIAL_CONFLICT = 1219
}
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct SESSION_INFO_502 {
public static readonly int SIZE_OF = Marshal.SizeOf(typeof(SESSION_INFO_502));
public string sesi502_cname;
public string sesi502_username;
public uint sesi502_num_opens;
public uint sesi502_time;
public uint sesi502_idle_time;
public SESSION_INFO_502_USER_FLAGS sesi502_user_flags;
public string sesi502_cltype_name;
public string sesi502_transport;
}
public enum SESSION_INFO_502_USER_FLAGS : uint {
SESS_GUEST = 1,
SESS_NOENCRYPTION = 2
}
}
非常感谢。很难罚款和非常好的工作样品! – 2014-11-13 23:02:18
嗨本,WNetOpenEnum枚举所有连接的资源也。我只想要通过Active Directory连接的用户的过滤列表。在服务器上,许多网络资源被连接和断开。所以他们对我没用。我从来没有做过这种类型的编程。完成此任何资源将非常有帮助。 – ricky2002 2010-03-10 15:27:11
也许只是列举连接到NETLOGON $的用户就足够了,IIRC任何用户在使用任何其他资源之前都必须连接到该用户。 – 2010-03-10 17:12:09