2010-12-20 2 views
1

J'ai un problème, c'est-à-dire ... je lance un programme avec un clic droit -> exécuter en tant qu'administrateur. Ce qui signifie que le programme s'exécute dans un contexte administratif.Obtention de l'utilisateur actuellement connecté (FullToken Context)

WindowsIdentity.GetCurrent().Name; 

si je tente d'obtenir le nom d'utilisateur de cette façon que je vais obtenir l'utilisateur qui a commencé le programm en tant qu'administrateur .. par exemple « administrateur », mais ce que je besoin est le nom de l'utilisateur connecté courant est par exemple: bob

Quelqu'un peut-il m'aider? :)

Répondre

0

Peut-être que vous pourriez commencer comme utilisateur normal, l'enregistrement du nom d'utilisateur, puis demander par programmation altitude:

Windows 7 and Vista UAC - Programmatically requesting elevation in C#

+0

Je sais que ce serait possible via l'usurpation d'identité. Donc, il n'y a pas d'autre moyen? – Lars

+0

Je ne connais aucune autre méthode .. Ceci est un problème courant lors de l'installation, car vous avez besoin d'un accès administrateur pour écrire des fichiers, mais vous devez avoir un accès utilisateur pour obtenir les chemins utilisateur corrects (/ docs et settings/Username/etc) ...?!? .. ce n'est pas un bug, c'est une fonctionnalité ... –

+0

:) non je veux décharger tous les registres que j'ai chargés mais pas le registre des utilisateurs locaux que j'utilise comme une sorte de référence. donc j'ai besoin de savoir lequel c'est. – Lars

0

Toutes les bibliothèques .NET vous donneront l'utilisateur du contexte actuel ('Administrateur' dans votre cas).

Si vous essayez d'obtenir votre code, vous pouvez peut lire sur: Security in the .NET framework

4

Vous pouvez essayer d'utiliser WMI (System.Management.dll) pour obtenir le propriétaire du processus explorer.exe.

string GetExplorerUser() 
{ 
    var query = new ObjectQuery(
     "SELECT * FROM Win32_Process WHERE Name = 'explorer.exe'"); 

    var explorerProcesses = new ManagementObjectSearcher(query).Get(); 

    foreach (ManagementObject mo in explorerProcesses) 
    { 
     string[] ownerInfo = new string[2]; 
     mo.InvokeMethod("GetOwner", (object[])ownerInfo); 

     return String.Concat(ownerInfo[1], @"\", ownerInfo[0]); 
    } 

    return string.Empty; 
} 

Cela repose sur le fait que le processus de l'explorateur est un seul exemple de sorte que vous ne finissent pas avec la possibilité d'avoir plusieurs processus en cours d'exécution avec l'explorateur informations d'identification utilisateur différents.

+0

qu'en est-il des services terminaux où chaque session pourrait avoir son propre processus explorer.exe? –

+0

J'ai bien peur de ne pas pouvoir vous aider dans ce contexte. –

+0

Exactement ce que je cherchais! –

0

1) Cassia devrait être en mesure de vous donner une liste des utilisateurs actuellement connectés, y compris RDC.

foreach (ITerminalServicesSession sess in new TerminalServicesManager().GetSessions()) 
{ 
    // sess.SessionId 
    // sess.UserName 
} 

2) WMI (SO answer)

Select * from Win32_LogonSession 

3) PInvoke à WTSEnumerateSessions

4) Énumérer toutes les instances de "explorer.exe" et obtenir le propriétaire en utilisant PInvoke (OpenProcessHandle) .

Process[] processes = Process.GetProcessesByName("explorer"); 

Ceci est un peu hacky. WMI peut également être utilisé pour cela.

Cela peut être une bonne idée de définir winmgmt en tant que dépendance pour votre service si vous avez décidé d'utiliser une solution qui utilise WMI.

Questions connexes