我有一个应用程序,我需要在用户未登录时在后台定期运行一些代码,然后在他们重新登录到Windows会话时停止运行代码。
为此,我在SystemEvents.SessionSwitch
事件上启动了一个简单的计时器,如下所示:
Private Sub SystemEvent_SessionSwitched(sender As Object, e As Microsoft.Win32.SessionSwitchEventArgs)
WriteLogEntry("System Event Switch user Fired... initiating timer")
_switchTimer = New Timers.Timer(8000)
AddHandler _switchTimer.Elapsed, AddressOf OnSwitchTimedEvent
_switchTimer.AutoReset = True
_switchTimer.Enabled = True
End Sub
这很好,只是我需要的方式。
当Timer过去时,我需要检查我的用户是否已重新登录,或者是否执行了一些后台工作。所以我尝试了这个:
Private Sub OnSwitchTimedEvent(sender As Object, e As Timers.ElapsedEventArgs)
If Environment.UserName = Me.User.ID Then 'Me.User.ID stores the windows username of the person logged into my application
WriteLogEntry("User Logged back in... Resume Normal activity")
_switchTimer.Stop()
Exit Sub
Else
'Do the background stuff here
End If
End Sub
基于Environment.UserName
的描述(“获取当前登录到Windows操作系统的人的用户名。”)我认为这将是完美的。然而,似乎微软所说的和他们的意思是两个不同的东西,因为它总是返回启动我的应用程序的用户,这不是我想要的。
例如,如果“User1”登录并启动我的应用程序然后“User2”出现并将用户切换到他/她的Windows帐户,Environment.UserName
仍会返回“User1”。我需要弄清楚如何在这个例子中返回活动用户(即“User2”)。
如果有人知道正确的属性,或者甚至是找到我的应用程序的用户何时再次激活的替代解决方案,那将非常感激。
编辑:最终游戏是看我的用户何时登录而不是获取名称...获取名称是我能看到的唯一方式
答案 0 :(得分:1)
好的,所以我觉得你真的很亲密。我原以为会话切换事件会为所有用户触发,但它似乎只对启动该程序的用户触发。注意:我只是将其作为用户进程进行测试,而不是作为系统服务进行测试,其中可能会有不同的行为。当您运行下面的程序时,您只能为启动它的用户获取事件。如果其他用户登录系统,您将看不到事件。
using System;
using System.Management;
using Microsoft.Win32;
namespace userloggedin
{
class Program
{
static void Main(string[] args)
{
SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
// block main thread
Console.ReadLine();
//Do this during application close to avoid handle leak
Microsoft.Win32.SystemEvents.SessionSwitch -= new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
}
static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
switch (e.Reason)
{
case SessionSwitchReason.ConsoleConnect:
case SessionSwitchReason.RemoteConnect:
case SessionSwitchReason.SessionLogon:
case SessionSwitchReason.SessionUnlock:
Console.WriteLine("User connected, logged on, or unlocked so stop your processing.");
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT UserName FROM Win32_ComputerSystem");
foreach (ManagementObject queryObj in searcher.Get())
{
var loggedOnUserName = queryObj["UserName"].ToString();
loggedOnUserName = loggedOnUserName.Substring(loggedOnUserName.LastIndexOf('\\') + 1);
Console.WriteLine(string.Format("User who just logged on is {0}.", loggedOnUserName));
}
break;
case SessionSwitchReason.ConsoleDisconnect:
case SessionSwitchReason.RemoteDisconnect:
case SessionSwitchReason.SessionLock:
case SessionSwitchReason.SessionLogoff:
Console.WriteLine("User logged off, locked, or disconnected so start your processing.");
break;
}
}
}
}