Как получить имя пользователя входа в Windows для пользователя входа в SQL - PullRequest
10 голосов
/ 15 марта 2009

Используя sp_who2, я могу получить список текущих пользователей и имен компьютеров. Некоторые пользователи используют имя пользователя для входа в SQL Server, например, sa. Можно ли как-нибудь получить имя пользователя входа в Windows для пользователей входа в систему SQL?

Если нет способа получить пользователей для входа в Windows по именам компьютеров, могу ли я использовать класс WMI или C #, чтобы узнать имена пользователей для входа в Windows по именам компьютеров?

Мой SQL-сервер - Microsoft SQL Server 2005, а Windows - Server 2003.

Ответы [ 6 ]

20 голосов
/ 30 декабря 2010

Для получения имени пользователя и машины используйте это:

SELECT HOST_NAME() AS HostName, SUSER_NAME() LoggedInUser
2 голосов
/ 16 марта 2009

Нет связи между логином SQL и именем пользователя NT.

Вы спрашивали подобное здесь: Как узнать имя пользователя и имя машины для доступа к SQL-серверу

Подход WMI будет неоднозначным, если на клиентском ПК будет зарегистрировано более 1 пользователя (например, учетные записи служб, удаленный пользователь через mstsc и т. Д.). Любой подобный подход потребует прав администратора на клиентском ПК и для используемой учетной записи.

Я сомневаюсь, что вы можете сделать это в режиме реального времени.

Все, что вы можете сделать, это записать client_net_address в sys.dm_exec_connections и вернуться оттуда, возможно, через WMI, но не из самого SQL Server.

Вам нужно хотя бы имя пользователя? Или просто клиентский ПК, чтобы вы могли изменить строку подключения приложения?

Ваше окончательное решение - изменить пароль sa и посмотреть, кто звонит, если у вас относительно мало SQL-соединений

1 голос
/ 31 января 2016
  1. Вы можете получить IP-адрес клиента и удаленный PID, запрашивая сеансы и соединения.
  2. Используйте эту информацию для построения команды TASKLIST.
  3. Используйте XP_CMDShell для выполнения встроенной команды, чтобы получить пользователя.

    <code>DECLARE @CMD VARCHAR(500) = 
    (SELECT  TOP 1 'tasklist /S ' + client_net_address + 
    ' /FI "PID eq ' + CONVERT(VARCHAR(MAX),host_process_id) + 
    '" /V /FO LIST /U DOMAIN\Admin /P password' 
    FROM sys.dm_exec_connections C JOIN sys.dm_exec_sessions S
    ON C.session_id = S.session_id WHERE S.session_id = @@SPID)
    EXEC xp_cmdshell @CMD

Вы можете использовать его как угодно. Либо для отправки почты администратору базы данных, используя его в триггере ALL SERVER, либо для аудита Ad-Hoc. Надеюсь, это поможет =)

0 голосов
/ 15 марта 2009

OK. Я пытался использовать класс WMI для получения информации об удаленном компьютере (класс WMI \ fullmancinename \ roor \ cimc2 и выбор объекта запроса * из Win32_ComputerSystem). Он работает на моем локальном компьютере, но с именем удаленного компьютера, вам нужно передать имя пользователя и пароль с достаточным разрешением безопасности для доступа или чтения. Это еще одна проблема безопасности Windows, связанная с получением имени пользователя с удаленного компьютера.

Мои коды попыток основаны на ссылке C # Считывание имени пользователя для входа в Windows в WMI .

0 голосов
/ 15 марта 2009

Я стреляю в темноте, но, может быть, мои мысли помогут тебе найти ответ. Из того, что я могу сказать, нет прямого способа получить это. Который ИМХО это хорошая вещь. Теперь пара мыслей:

Если это пользовательское приложение, возможно, вы можете включить эту информацию в строку подключения в качестве имени приложения. Если это серверное приложение и вы используете олицетворение, вы потеряете возможность создавать пулы соединений, если вы это сделаете. В клиентском приложении это не должно быть проблемой.

У ваших клиентов есть только один зарегистрированный пользователь? Например, настольное приложение? Вы можете использовать WMI как таковой . Если снова это сервер, и вы хотите знать, чей контекст безопасности работает под ним, вы все равно сможете получить эту информацию. В противном случае вы могли бы по крайней мере выяснить, кто запустил процесс.

SQL Profiler знает PID клиентского процесса. Но я не мог найти, где он хранится в SQL. Если вы можете найти, как вы можете получить PID (Вы можете просто запустить трассировку программно и сохранить событие входа в таблицу). Вы можете получить запускающего пользователя, используя этот скрипт .

0 голосов
/ 15 марта 2009

Я не знаю, есть ли способ сделать именно то, что вы просите. Однако в прошлом я использовал sql profiler и включил «Имя хоста» в столбцы результатов. Имена машин, на которых я работаю, уникальны и могут быть отслежены пользователем. Если имена ваших машин также уникальны, это может дать нужный вам результат. Вы можете отфильтровать по имени пользователя = sa, чтобы сузить результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...