Re[3]: Как получить SID текущего сеанса?
От: kov_serg Россия  
Дата: 29.12.19 22:49
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, kov_serg, Вы писали:


_>>А если так попробовать?


ЕМ>На "чистом" WinAPI, без залезания в классы WMI — никак?

Не ну можно конечно и грязно сделать:
#include <windows.h>
#include <sddl.h>
#include <stdio.h>

static void GetWindowSID(HWND wnd,char *dst,int dst_size) {
    enum { buf_size=256 }; char buf[buf_size];
    HANDLE pr=0,token=0; DWORD pid=0; BOOL res; char *sid=0;

    *dst=0;
    GetWindowThreadProcessId(wnd,&pid);                            if (!pid) goto leave;
    pr=OpenProcess(PROCESS_QUERY_INFORMATION,0,pid);               if (!pr)  goto leave;
    res=OpenProcessToken(pr,TOKEN_QUERY,&token);                   if (!res) goto leave;
    res=GetTokenInformation(token,TokenUser,buf,buf_size,0);       if (!res) goto leave;
    res=ConvertSidToStringSidA(((PTOKEN_USER)buf)->User.Sid,&sid); if (!res) goto leave;
leave:
    if (sid) {
        strncpy(dst,sid,dst_size); 
        LocalFree(sid);
    }
    if (token) CloseHandle(token);
    if (pr) CloseHandle(pr);
}
static BOOL CALLBACK enum_window(HWND wnd, LPARAM prm) {
    *(HWND*)prm=wnd;
    return FALSE;
}
static char* GetSID(char* dst,int dst_size) {
    HWND wnd=0; 
    EnumWindows(enum_window,(LPARAM)&wnd);
    GetWindowSID(wnd,dst,dst_size);
    return dst;
}
int main(int argc,char** argv) {
    enum { buf_size=64 }; char buf[buf_size];
    printf("%s\n",GetSID(buf,buf_size));
    return 0;
}

Но есть нюансы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.