如果当前活动的Windows用户不是Environment.UserName,或者当用户重新登录时,如何获取当前活动的Windows用户的用户名?

时间:2016-01-11 17:37:22

标签: vb.net windows

我有一个应用程序,我需要在用户未登录时在后台定期运行一些代码,然后在他们重新登录到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”)。

如果有人知道正确的属性,或者甚至是找到我的应用程序的用户何时再次激活的替代解决方案,那将非常感激。

编辑:最终游戏是看我的用户何时登录而不是获取名称...获取名称是我能看到的唯一方式

1 个答案:

答案 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;
            }
        }
    }
}