2011-04-05 6 views
0

Mon programme est démarré à partir d'un service qui fonctionne sous le Local System Account (un utilisateur réel est connecté). L'une des tâches du programme consiste à stocker des fichiers sur un chemin réseau, qui doit contenir le nom d'utilisateur actuel, par ex. \\server\\storage\\%username%, mais le problème est que je reçois le nom du compte du système au lieu du compte utilisateur lorsque je lis la variable d'environnement:Récupère le nom d'utilisateur actuel d'un programme démarré en tant que compte système local

Environment.GetEnvironmentVariable("username"); 

Y at-il un moyen d'obtenir le nom d'utilisateur dans ce cas?

Répondre

1

Ma solution était de savoir quel utilisateur a commencé le processus de l'explorateur:

ne fonctionnera que si vous faites référence à la bibliothèque System.Management .NET:

private static string GetExplorerUser() 
{ 
    var process = Process.GetProcessesByName("explorer"); 
    return process.Length > 0 
     ? GetUsernameByPid(process[0].Id) 
     : "Unknown-User"; 
} 

private static string GetUsernameByPid(int pid) 
{ 
    var query = new ObjectQuery("SELECT * from Win32_Process " 
     + " WHERE ProcessID = '" + pid + "'"); 

    var searcher = new ManagementObjectSearcher(query); 
    if (searcher.Get().Count == 0) 
     return "Unknown-User"; 

    foreach (ManagementObject obj in searcher.Get()) 
    { 
     var owner = new String[2]; 
     obj.InvokeMethod("GetOwner", owner); 
     return owner[0] ?? "Unknown-User"; 
    } 

    return "Unknown-User"; 
} 

Une autre possibilité est d'analyser la sortie la commande qwinsta.

0

Si vous ne prenez aucune mesure pour lancer votre programme en tant qu'utilisateur différent (CreateProcessAsUser et al.), Il fonctionnera comme le même utilisateur que le programme appelant.

Questions connexes