Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, 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;
}
Но есть нюансы