2010-03-10 71 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