printf("Cannot create SID for Administrators [%lu].\n", GetLastError());
return 1;
}
// now, loop through groups in token and compare
found = 0;
for (i = 0; i < groupList.GroupCount; ++i) {
if (EqualSid(pAdminSid, groupList.Groups[i].Sid)) {
found = 1;
break;
}
}
FreeSid(pAdminSid);
CloseHandle(hTok);
return !!found;
}
int main() {
bool j, l;
j = jerry_coffin_method();
l = look_at_token_method();
printf("NetUserGetInfo(): The current user is %san Administrator.\n", j? "": "not ");
printf("Process token: The current user is %sa member of the Administrators group.\n", l? "": "not ");
return 0;
}
//****************************************************************************//
Как узнать язык Windows по умолчанию?
Nomadicлаконично отвечает:
GetSystemDefaultLCID
GetLocaleInfo
GetLocalUserList — возвращает список пользователей (Windows NT, Windows 2000)
Кондратюк Виталийпредлагает следующий код:
unitFunc;
interface
usesSysutils, Classes, Stdctrls, Comctrls, Graphics, Windows;
////////////////////////////////////////////////////////////////////////////////
{$EXTERNALSYM NetUserEnum}
functionNetUserEnum(servername: LPWSTR; level, filter: DWORD; bufptr: Pointer; prefmaxlen: DWORD; entriesread, totalentries, resume_handle: LPDWORD): DWORD; stdcall; external'NetApi32.dll' Name 'NetUserEnum';
functionNetApiBufferFree(Buffer: Pointer{LPVOID}): DWORD; stdcall; external'NetApi32.dll' Name 'NetApiBufferFree';
////////////////////////////////////////////////////////////////////////////////
procedureGetLocalUserList(ulist: TStringList);
implementation
//------------------------------------------------------------------------------
// возвращает список пользователей локального хоста
//------------------------------------------------------------------------------
procedureGetLocalUserList(ulist: TStringList);
const
NERR_SUCCESS = 0;
FILTER_TEMP_DUPLICATE_ACCOUNT = $0001;
FILTER_NORMAL_ACCOUNT = $0002;
FILTER_PROXY_ACCOUNT = $0004;
FILTER_INTERDOMAIN_TRUST_ACCOUNT = $0008;
FILTER_WORKSTATION_TRUST_ACCOUNT = $0010;
FILTER_SERVER_TRUST_ACCOUNT = $0020;
type
TUSER_INFO_10 = record
usri10_name, usri10_comment, usri10_usr_comment, usri10_full_name: PWideChar;
end;
PUSER_INFO_10 = ^TUSER_INFO_10;
var
dwERead, dwETotal, dwRes, res: DWORD;
inf: PUSER_INFO_10;
info: Pointer;
p: PChar;
i: Integer;
begin
ifulist= nil thenExit;
ulist.Clear;
info := nil;
dwRes := 0;
res := NetUserEnum( nil, 10, FILTER_NORMAL_ACCOUNT, @info, 65536, @dwERead, @dwETotal, @dwRes);
if(res<>NERR_SUCCESS) or(info= nil) thenExit;
p := PChar(info);
fori:=0 todwERead-1 do begin
inf := PUSER_INFO_10(p + i*SizeOf(TUSER_INFO_10));
ulist.Add(WideCharToString(PWideChar((inf^).usri10_name)));
end;
NetApiBufferFree(info);
end;
end.
Каков способ обмена информацией между приложениями Win32 – Win16?
Nomadicпредлагает следующее:
Пользуйтесь сообщением WM_COPYDATA.
Для Win16 константа определена как $004A, для Win32 смотрите в WinAPI Help.
#define WM_COPYDATA 0x004A
/*
* lParam of WM_COPYDATA message points to…
*/
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
Остановка и запуск сервисов
Postmasterпредлагает следующий код:
Unit1.dfm
objectForm1: TForm1
Left = 192
Top = 107
Width = 264
Height = 121
Caption = 'Сервис'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
objectLabel1: TLabel
Left = 2
Top = 8
Width = 67
Height = 13
Caption = 'Имя сервиса'
end
objectButton1: TButton
Left = 4
Top = 56
Width = 95
Height = 25
Caption = 'Стоп сервис'
TabOrder = 0
OnClick = Button1Click
end
objectButton2: TButton
Left = 148
Top = 56
Width = 95
Height = 25
Caption = 'Старт сервис'
TabOrder = 1
OnClick = Button2Click
end
objectEdit1: TEdit
Left = 0
Top = 24
Width = 241
Height = 21
TabOrder = 2
Text = 'Messenger'
end
end
Unit1.pas
unitUnit1;
interface
usesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Winsvc;
typeTForm1 = class(TForm)
Читать дальше