我想從計算機管理 - >共享文件夾 - >會話選項卡中將關於連接的網絡用戶的數據提取到我的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