none
System.DirectoryServices.AccountManagement и собственная служба Windows RRS feed

  • Общие обсуждения

  • Уважаемые коллеги!

    Разрабатываю службу, которая запускается вместе с ОС Windows и следит за тем, кто "логинится" на текущей рабочей станции и собирает статистику по каждому пользователю (сколько времени был за текущей рабочей станцией пользователь, сколько раз была блокировка-разблокировка и т.д.).

    Пишу на VB.Net.

    Служба под аккаунтом LocalSystem и попытка определить текущего пользователя сводилась к тому, что всегда определялся System.

    В сети нашёл способ, позволяющий определить логин пользователя, который выполнил вход в систему (предварительно перед определением пользователя служба ожидает запуск процесса explorer):

    Private Function GetUser() As String
            Try
                Dim strComputer = "."
                Dim objWMIService As Object
                Dim colComputer As Object
                objWMIService = GetObject("winmgmts:" _
            & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
                colComputer = objWMIService.ExecQuery _
            ("Select * from Win32_ComputerSystem")
                For Each objComputer In colComputer
                    Return objComputer.UserName
                Next
            Catch ex As Exception
                Return ""
            End Try
            Return ""
    
        End Function

    Данный код обеспечивает стабильное получение логина пользователя.

    Но периодически всё-таки он не срабатывает. 

    Так как всё рабочие станции находятся в домене и каждый пользователь имеется в AD решил пойти другим путем: хочу вместо логина пользователя получать его SID и дальше работать с AD для точной идентификации пользователя (получение ФИО, e-mail и т.д.).

    Используя следующий код можно получить данные о текущем пользователе из AD. Но, если это оконное приложение, то код срабатывает, а вставив его в тело службы - происходит какое-то исключение (не могу поймать и понять из-за чего не срабатывает).

    Imports System.DirectoryServices.AccountManagement
    Dim currentADUser As System.DirectoryServices.AccountManagement.UserPrincipal
            currentADUser = System.DirectoryServices.AccountManagement.UserPrincipal.Current

    Если запустить данный код в оконном приложении, то в переменной currentADUser будет вся необходимая информация: SID, SamAccountName, ФИО и т.д.

    Подскажите, пожалуйста, возможно ли в системной службе получить данные о текущем пользователе через AD?

    С уважением, Владимир.


    30 июня 2015 г. 15:42

Все ответы