2010-03-10 67 views
2

我想从计算机管理 - >共享文件夹 - >会话选项卡中将关于连接的网络用户的数据提取到我的c#应用程序中。任何人都可以指导我使用哪些名称空间以及一些示例代码,以从计算机管理 - >共享文件夹 - >会话选项卡导入用户名和IP地址?枚举网络会话

问候

回答

0

你不想与计算机管理互动,你怎么称呼它同样的功能,减少中间人圈外。

对于发现关于当前的网络连接,你可能会寻找WNetOpenEnumNetConnectionEnum

我不认为有一个在BCL此一个.NET函数,你必须使用的P/Invoke或寻找一个第三方库(或我个人最喜欢的,用C++/CLI写一个包装)

+0

嗨本,WNetOpenEnum枚举所有连接的资源也。我只想要通过Active Directory连接的用户的过滤列表。在服务器上,许多网络资源被连接和断开。所以他们对我没用。我从来没有做过这种类型的编程。完成此任何资源将非常有帮助。 – ricky2002 2010-03-10 15:27:11

+0

也许只是列举连接到NETLOGON $的用户就足够了,IIRC任何用户在使用任何其他资源之前都必须连接到该用户。 – 2010-03-10 17:12:09

6

你想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 
    } 
} 
+0

非常感谢。很难罚款和非常好的工作样品! – 2014-11-13 23:02:18