2010-12-14 28 views
2

J'ai du mal à obtenir le nom d'utilisateur d'une personne connectée à une machine à l'aide d'un service Windows. Lorsque j'utilise à la fois System.Environment.UserName ou WindowsIdentity.GetCurrent(). UserName, j'obtiens NTAUTHORITY \ SYSTEM mais quand cette application est poussée, je dois être capable de mapper vers l'UserID de la personne connectée au système. Le système d'exploitation sur lequel il sera utilisé sera Windows XP.C# .NET Obtention du nom d'utilisateur de la machine utilisant le service Windows

Toute aide serait très appréciée.

+1

De quel utilisateur voulez-vous? Il peut y avoir plusieurs personnes connectées à des sessions sur une machine (soit par un utilisateur rapide qui allume XP, soit par un bureau à distance sur un serveur). Chaque session peut avoir des processus s'exécutant sous des connexions différentes (via la commande Exécuter en tant que). –

+0

L'utilisateur actuellement connecté. Heureusement, ces machines ne peuvent autoriser qu'un seul client à la fois. –

+0

Tim, tu devrais le reformuler et l'afficher comme réponse - Je soupçonne que le PO demande l'impossible et le tien est la meilleure réponse qu'il obtiendra! –

Répondre

1

Pour XP, ce conseil devrait demander: Get Window Station for a non-interactive user per process, user or session?

  • Appel OpenWindowStation pour obtenir une poignée "winsta0"
  • Appel GetUserObjectInformation pour savoir qui est propriétaire winsta0

Cependant, cette approche va casser lorsque vous mettez à niveau votre application vers Vista, Windows 7 ou plus, où les services s'exécutent dans une session différente des connexions interactives. Vous devrez appeler l'API des services Terminal Server pour obtenir la liste des utilisateurs connectés et choisir votre "interactif".

-1

Le service Windows s'exécute toujours sous les informations d'identification fournies dans l'onglet Propriétés/Connexion du service. Cela n'a rien à voir avec les informations d'identification de la ou des personnes actuellement connectées à Windows dans leurs propres sessions. La valeur de NTAUTHORITY \ SYSTEM est correcte car votre service s'exécute sous les informations d'identification du compte système local.

Vous ne pouvez pas exécuter le service Windows sous le compte de l'utilisateur 'actuellement connecté' - ce n'est pas ce que le service Windows est pour.

+0

Il demandait comment obtenir le nom d'utilisateur connecté à partir d'un service, maintenant comment exécuter un service sous le compte de 'actuellement connecté' utilisateur – iedoc

4

Essayez ceci:

var connectionOptions = new ConnectionOptions(); 
var scope = new System.Management.ManagementScope("\\\\localhost", connectionOptions); 
var query = new System.Management.ObjectQuery("select * from Win32_ComputerSystem"); 
var searcher = new ManagementObjectSearcher(scope, query); 
foreach (var row in searcher.Get()) 
{ 
    Console.WriteLine(row["UserName"].ToString().ToLower()); 
} 
+1

+1 ce code fait exactement ce que je veux, je souhaite juste que je ne le veux pas – Jodrell

+0

Je suis également confronté au même problème, @jgauffin votre code fonctionnera aussi pour OS 64 bits? – Wilz

+1

oui, il le devrait. – jgauffin