16 votes

Comment obtenir le nom d'utilisateur de connexion Windows pour un utilisateur de connexion SQL ?

En utilisant sp_who2, je peux obtenir une liste des utilisateurs connectés et des noms de machines. Certains utilisateurs utilisent le nom d'utilisateur de SQL Server tel que sa. Existe-t-il un moyen d'obtenir le nom d'utilisateur de connexion Windows pour les utilisateurs de connexion SQL ?

S'il n'existe aucun moyen d'obtenir les noms des utilisateurs de Windows à partir des noms des machines, puis-je utiliser la classe WMI ou C# pour obtenir les noms des utilisateurs de Windows à partir de leurs noms de machines ?

Mon serveur SQL est Microsoft SQL Server 2005 et Windows est Server 2003.

23voto

mko Points 1

Pour obtenir le nom de l'utilisateur et de la machine, procédez comme suit :

SELECT HOST_NAME() AS HostName, SUSER_NAME() LoggedInUser

4voto

gbn Points 197263

Il n'y a pas de lien entre un login SQL et le nom d'utilisateur NT.

Vous avez posé une question similaire ici : Comment trouver le nom de l'utilisateur et le nom de la machine pour accéder au serveur SQL ?

L'approche WMI sera ambiguë si plus d'un utilisateur est connecté au PC client (par exemple, comptes de service, utilisateur distant via mstsc, etc.) Toute approche de ce type nécessitera également des droits d'administrateur sur le PC client pour le compte utilisé.

Je doute que vous puissiez le faire en temps réel.

Tout ce que vous pouvez faire, c'est enregistrer le client_net_address en sys.dm_exec_connections et de remonter à partir de là, peut-être via WMI mais pas à partir du serveur SQL lui-même.

Avez-vous besoin du nom d'utilisateur ? Ou seulement le PC client pour pouvoir modifier la chaîne de connexion de l'application ?

La dernière solution est de changer le mot de passe sa et de voir qui appelle, si vous n'avez que relativement peu de connexions SQL.

1voto

Deepak A S Points 46
  1. Vous pouvez obtenir l'adresse IP du client et le PID distant en interrogeant les sessions et les connexions.
  2. Utilisez ces informations pour créer une commande TASKLIST.
  3. Utilisez XP_CMDShell pour exécuter la commande construite pour obtenir l'utilisateur.

    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

Vous pouvez l'utiliser à votre guise. Soit pour envoyer un mail au DBA en l'utilisant dans un trigger ALL SERVER, soit pour un audit ad-hoc. J'espère que cela vous aidera =)

0voto

Paul G Points 1615

Je ne sais pas s'il existe un moyen de faire exactement ce que vous demandez. Cependant, ce que j'ai fait dans le passé, c'est utiliser sql profiler et inclure le "Host Name" dans les colonnes de résultats. Il se trouve que les noms des machines où je travaille sont uniques et permettent de remonter jusqu'à un utilisateur. Si les noms de vos machines sont également uniques, vous obtiendrez peut-être le résultat dont vous avez besoin. Vous pouvez filtrer sur le nom de connexion = sa pour réduire les résultats.

0voto

JoshBerke Points 34238

Je tire dans le vide mais peut-être que mes réflexions vous aideront à trouver votre réponse. D'après ce que je sais, il n'y a pas de moyen direct d'obtenir cela. Ce qui, à mon avis, est une bonne chose. Maintenant, quelques réflexions :

S'il s'agit d'une application personnalisée, vous pouvez inclure cette information dans la chaîne de connexion comme Nom de l'application peut-être. S'il s'agit d'une application serveur et que vous utilisez l'impersonation, vous perdrez la possibilité de regrouper les connexions si vous faites cela. Sur une application client, cela ne devrait pas poser de problème.

Vos clients n'ont-ils qu'un seul utilisateur connecté à un moment donné ? Par exemple, une application de bureau ? Vous pourriez utiliser WMI comme suit . S'il s'agit d'un serveur et que vous voulez savoir sous quel contexte de sécurité il fonctionne, vous pourrez peut-être obtenir cette information. Sinon, vous pouvez au moins déterminer qui a lancé le processus.

SQL Profiler connaît le PID du processus client. Mais je n'ai pas trouvé l'endroit où il est stocké dans SQL. Si vous pouvez trouver comment vous pouvez obtenir le PID (vous pourriez simplement exécuter une trace par programme et stocker l'événement de connexion dans une table). Vous pouvez obtenir l'utilisateur de lancement en utilisant cette script .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X