.NET Core 如何判断程序是否在远程桌面(RDP)下运行
點擊上方藍字關注“汪宇杰博客”
導語
由于疫情的關系,很久沒發文章了。今天終于穩定下來在家辦公,抽空分享一個剛學會的技巧。最近在家辦公的程序員可能避免不了要用遠程桌面,那么問題來了,你的 .NET Core 程序有沒有辦法知道自己是否在 Windows 遠程桌面環境下運行呢?
Windows Forms
如果你用的是 .NET Core 3.x 版本,并開發的是 Windows Forms 應用,那么恭喜你,.NET 自帶了一個簡單粗暴的方法。
SystemInformation.TerminalServerSession 即可返回當前會話是否在遠程桌面下。
public partial class Form1 : Form
{
? ? public Form1()
? ? {
? ? ? ? InitializeComponent();
? ? ? ? if (IsRemoteSession)
? ? ? ? {
? ? ? ? ? ? MessageBox.Show("Under RDP");
? ? ? ? }
? ? }
? ? public static Boolean IsRemoteSession => SystemInformation.TerminalServerSession;
}
運行效果
去你的 WinForms?
Bing 不是人人都喜歡 WinForms,畢竟它代表落后、不思進取的拖控件程序員(即使他們下班時候天還亮著)。那么其他類型的 .NET Core 程序如何判斷自己是否在 RDP 下運行呢?我們需要 P/Invoke 騷操作。
.NET Core 使用 P/Invoke 的姿勢和 .NET Framework 幾乎一致。只要一個 [DllImport] 標記即可。
根據田牌文檔描述,Windows 本身就帶有一個 Win32 API可以返回當前會話是否為遠程桌面。即 User32.dll 上的?GetSystemMetrics( SM_REMOTESESSION ); 方法
文檔傳送門:https://docs.microsoft.com/en-us/windows/win32/termserv/detecting-the-terminal-services-environment?
其中的?SM_REMOTESESSION 其實是個預定義的 int 值,在 C# 中可表示為 0x1000。使用 P/Invoke 判斷一個 Console 程序是否運行在 RDP 下的代碼如下:
static void Main(string[] args)
{
? ? bool isRDP = GetSystemMetrics(SM_REMOTESESSION);
? ? Console.WriteLine($"Running under RDP: {isRDP}");
? ? Console.ReadKey();
}
const int SM_REMOTESESSION = 0x1000;
[DllImport("user32")]
static extern bool GetSystemMetrics(int index);
其中 user32 后面的 .dll 可以省略。.NET Core 在 Windows 上會自動去找 dll,在 Linux 上會去找 so (即使 Linux Bing 沒有 RDP 這個東西也沒有 user32 這個庫)
運行效果
不過這種技巧大家平時正常寫代碼的時候一定要盡量避免,在 .NET 的托管環境下調用非托管代碼不僅會導致程序和平臺及系統版本耦合,還易爆,爆完還難以抓異常信息。有關 P/Invoke 的詳細介紹,請參考微軟文檔:https://docs.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke
總結
以上是生活随笔為你收集整理的.NET Core 如何判断程序是否在远程桌面(RDP)下运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 疫情之下,使用FRP实现内网穿透,远程连
- 下一篇: 《ASP.NET Core 微服务实战》