Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Тут можно читать онлайн Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Советы по Delphi. Версия 1.4.3 от 1.1.2001
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - описание и краткое содержание, автор Валентин Озеров, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

…начиная с 1001. Смотрите другие файлы…

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать книгу онлайн бесплатно, автор Валентин Озеров
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

psidAdmin: PSID;

ptg: PTOKEN_GROUPS = nil;

htkThread: Integer; { HANDLE }

cbTokenGroups: Longint; { DWORD }

iGroup: Longint; { DWORD }

bAdmin: Boolean;

begin

Result := false;

if notOpenThreadToken(GetCurrentThread(), // get security token

TOKEN_QUERY, FALSE, htkThread) then

ifGetLastError() = ERROR_NO_TOKEN then begin

if notOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, htkThread) thenExit;

end elseExit;

ifGetTokenInformation(htkThread, // get #of groups

TokenGroups, nil, 0, cbTokenGroups) thenExit;

ifGetLastError() <> ERROR_INSUFFICIENT_BUFFER thenExit;

ptg := PTOKEN_GROUPS(getmem(cbTokenGroups));

if notAssigned(ptg) thenExit;

if notGetTokenInformation(htkThread, // get groups

TokenGroups, ptg, cbTokenGroups, cbTokenGroups) thenExit;

if notAllocateAndInitializeSid(SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin) thenExit;

iGroup := 0;

whileiGroup < ptg^.GroupCount do// check administrator group

begin

ifEqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then begin

Result := TRUE;

break;

end;

Inc(iGroup);

end;

FreeSid(psidAdmin);

end;

Два метода в одном флаконе:

#include

#include

#include

#pragma hdrstop

#pragma comment(lib, "netapi32.lib")

// My thanks to Jerry Coffin (jcoffin@taeus.com)

// for this much simpler method.

bool jerry_coffin_method() {

bool result;

DWORD rc;

wchar_t user_name[256];

USER_INFO_1 *info;

DWORD size = sizeof(user_name);

GetUserNameW(user_name, &size);

rc = NetUserGetInfo(NULL, user_name, 1, (byte **)&info);

if (rc != NERR_Success) return false;

result = info->usri1_priv == USER_PRIV_ADMIN;

NetApiBufferFree(info);

return result;

}

bool look_at_token_method() {

int found;

DWORD i, l;

HANDLE hTok;

PSID pAdminSid;

SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY;

byte rawGroupList[4096];

TOKEN_GROUPS& groupList = *((TOKEN_GROUPS *)rawGroupList);

if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, FALSE, &hTok)) {

printf( "Cannot open thread token, trying process token [%lu].\n", GetLastError());

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hTok)) {

printf("Cannot open process token, quitting [%lu].\n", GetLastError());

return 1;

}

}

// normally, I should get the size of the group list first, but ...

l = sizeof rawGroupList;

if (!GetTokenInformation(hTok, TokenGroups, &groupList, l, &l)) {

printf( "Cannot get group list from token [%lu].\n", GetLastError());

return 1;

}

// here, we cobble up a SID for the Administrators group, to compare to.

if (!AllocateAndInitializeSid(&ntAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSid )) {

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Валентин Озеров читать все книги автора по порядку

Валентин Озеров - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Советы по Delphi. Версия 1.4.3 от 1.1.2001 отзывы


Отзывы читателей о книге Советы по Delphi. Версия 1.4.3 от 1.1.2001, автор: Валентин Озеров. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x