Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Во всех найденных примерах, начиная с родного от MS, предлагается применять GetTokenInformation к маркеру, полученному от OpenProcessToken. Таким образом можно получить пользователя, от имени которого создан процесс, но не пользователя, которому принадлежит текущий сеанс. То есть, в простейшем случае, для процессов, созданных "as administrator", это не работает.
ЕМ>Попробовал применить GetUserObjectInformation к результатам GetProcessWindowStation и OpenInputDesktop — в обоих случаях возвращается какой-то бред, отдаленно похожий на well-known SID:
ЕМ>S-1-5-5-0-607555
ЕМ>Какие еще есть способы? Желательно, чтоб работало под XP, но можно и начиная с Win7.
А если так попробовать?
using System;
using System.Security.Principal;
using System.Management;
class App {
static string GetSID() {
var mos = new ManagementObjectSearcher(
new ManagementScope("\\\\localhost\\root\\cimv2"),
new ObjectQuery("SELECT username FROM Win32_ComputerSystem")
);
foreach (var mo in mos.Get()) {
var username = mo["username"].ToString();
var nta = new NTAccount(username);
var sid = (SecurityIdentifier)nta.Translate(typeof(SecurityIdentifier));
return sid.ToString();
}
throw new Exception("panic");
}
[STAThread]
static void Main(string[] args) {
Console.WriteLine(GetSID());
}
}