Определение имени текущего пользователя - C#

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. System.Security.Principal.WindowsIdentity.GetCurrent().Name;
Листинг программы
  1. Environment.UserName;
Определяет лишь пользователя с чьими правами мы запущены.. Требуется определить именно имя пользователя, работающего в системе. Вошло может и несколько, а работает один. Были идеи и с определением имени пользователя от которого запущен explorer.exe (тут тогда какие функции winapi использовать?)

Решение задачи: «Определение имени текущего пользователя»

textual
Листинг программы
  1. using System.Management;
  2. using System.Runtime.InteropServices;
  3. using System.Runtime.ConstrainedExecution;
  4. using System.Security;
  5.  
  6. static string GetExplorerUser()
  7. {
  8.     var query = new ObjectQuery("SELECT * FROM Win32_Process WHERE Name='explorer.exe' AND ProcessId=" + GetParentExplorerProcessId());
  9.     var explorerProcesses = new ManagementObjectSearcher(query).Get();
  10.     foreach (ManagementObject mo in explorerProcesses)
  11.     {
  12.         string[] ownerInfo = new string[2];
  13.         mo.InvokeMethod("GetOwner", (object[])ownerInfo);
  14.         return ownerInfo[1] + "\" + ownerInfo[0];
  15.    }
  16.    return "";
  17. }
  18.  
  19. private static uint GetParentExplorerProcessId()
  20. {
  21.    return GetParentExplorerProcessId(Process.GetCurrentProcess().Id);
  22. }
  23.  
  24. private static uint GetParentExplorerProcessId(int processId)
  25. {
  26.    const uint ERROR = 0;
  27.    
  28.    IntPtr hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  29.    if (hSnapshot == IntPtr.Zero) return ERROR;
  30.  
  31.    PROCESSENTRY32 procEntry = new PROCESSENTRY32();
  32.    procEntry.dwSize = (uint)Marshal.SizeOf(typeof(PROCESSENTRY32));
  33.  
  34.    if (Process32First(hSnapshot, ref procEntry) == false) return ERROR;
  35.    
  36.    List<PROCESSENTRY32> ids = new List<PROCESSENTRY32>();
  37.    do
  38.    {
  39.        ids.Add(procEntry);
  40.    }
  41.    while (Process32Next(hSnapshot, ref procEntry));
  42.    CloseHandle(hSnapshot);
  43.    
  44.    uint parentId = ids.Where(pe => pe.th32ProcessID == processId).FirstOrDefault().th32ParentProcessID;
  45.    for(;parentId != 0;)
  46.    {
  47.        string name = ids.Where(pe => pe.th32ProcessID == parentId).FirstOrDefault().szExeFile;
  48.        if ("explorer.exe".Equals(name, StringComparison.OrdinalIgnoreCase)) return parentId;
  49.        
  50.        parentId = ids.Where(pe => pe.th32ProcessID == parentId).FirstOrDefault().th32ParentProcessID;
  51.    }
  52.    
  53.    return ERROR;
  54. }
  55.  
  56. const uint TH32CS_SNAPPROCESS = 2;
  57.  
  58. [StructLayout(LayoutKind.Sequential)]
  59. public struct PROCESSENTRY32
  60. {
  61.    public uint dwSize;
  62.    public uint cntUsage;
  63.    public uint th32ProcessID;
  64.    public IntPtr th32DefaultHeapID;
  65.    public uint th32ModuleID;
  66.    public uint cntThreads;
  67.    public uint th32ParentProcessID;
  68.    public int pcPriClassBase;
  69.    public uint dwFlags;
  70.    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
  71.    public string szExeFile;
  72. };
  73.  
  74. [DllImport("kernel32.dll", SetLastError = true)]
  75. static extern IntPtr CreateToolhelp32Snapshot(uint dwFlags, uint th32ProcessID);
  76.  
  77. [DllImport("kernel32.dll")]
  78. static extern bool Process32First(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
  79.  
  80. [DllImport("kernel32.dll")]
  81. static extern bool Process32Next(IntPtr hSnapshot, ref PROCESSENTRY32 lppe);
  82.  
  83. [DllImport("kernel32.dll", SetLastError=true)]
  84. [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
  85. [SuppressUnmanagedCodeSecurity]
  86. [return: MarshalAs(UnmanagedType.Bool)]
  87. static extern bool CloseHandle(IntPtr hObject);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы