Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SID to string 
:(
    Опции темы
SlaUr
Дата 5.4.2004, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



pOsOl (спасибо ему) подсказал как получить SID текущего пользователя.
В своем примере перевод из SID в String он осуществил при помощи билиотеки advapi32.dll вот код :
Код

function ConvertSidToStringSid(Sid: PSID; var StringSid: PChar): Boolean; stdcall; external 'advapi32.dll' name 'ConvertSidToStringSidA'

но дело в том что в 9x виндах этой библиотеки нет , и я попытался (по примеру из Delphist faq (там пример кстати рабочий) загружать библиотеку динамически . Но мой код вызывает ошибку ,не могу понять вчем тут дело . Вот полный код получившегося теста:
Код

Function Sid2Text(Sid: PSID; var StringSid: Pchar):boolean;
var hndDLLHandle: THandle;
  ConvertSidToStringSidA : TConvertSidToStringSidA;
  ss:boolean;
begin
hndDLLHandle := loadLibrary ( 'advapi32.dll' );
if hndDLLHandle <>0 then
 begin
   @ConvertSidToStringSidA := getProcAddress ( hndDLLHandle, 'ConvertSidToStringSidA' );
   if addr ( ConvertSidToStringSidA ) <> nil then
     begin
       (*строка вызывающая ошибку*)
       ss:=ConvertSidToStringSidA(Sid,StringSid);
     end else StringSid:='Erorr';
 freeLibrary ( hndDLLHandle );
 end else StringSid:='Erorr';
end;



procedure TForm1.Button1Click(Sender: TObject);
var
UserName : PChar;
UserSid : PSID;
UserDomain : PChar;
SidStr : PChar;
NameSize, SidSize, DomainSize : cardinal;
SidUse : SID_NAME_USE;

begin
NameSize := 1024;
SidSize := 1024;
DomainSize := 1024;
GetMem(UserName, NameSize);
GetMem(UserDomain, DomainSize);
GetMem(UserSid, SidSize);
GetUserName(UserName, NameSize);
LookupAccountName(nil, UserName, UserSid,  SidSize, UserDomain, DomainSize, SidUse);
Sid2Text(UserSid, SidStr);
Caption := UserName + ' ' + UserDomain + ' ' + SidStr;
{ LocalFree(Cardinal(SidStr));}
FreeMem(UserDomain);
FreeMem(UserSid);
FreeMem(UserName);
end;

В чем тут ошибка ?
или (что лучше) может все таки кто нибудь переведет функию перевода SID в String c Си на Delphi
Вот этот код:
Код

// nearly straight from the SDK
BOOL Sid2Text( PSID ps, char *buf, int bufSize )
{
PSID_IDENTIFIER_AUTHORITY psia;
DWORD dwSubAuthorities;
DWORD dwSidRev = SID_REVISION;
DWORD i;
int n, size;
char *p;

// Validate the binary SID.

if ( ! IsValidSid( ps ) )
return FALSE;

// Get the identifier authority value from the SID.

psia = GetSidIdentifierAuthority( ps );

// Get the number of subauthorities in the SID.

dwSubAuthorities = *GetSidSubAuthorityCount( ps );

// Compute the buffer length.
// S-SID_REVISION- + IdentifierAuthority- + subauthorities- + NULL

size = 15 + 12 + ( 12 * dwSubAuthorities ) + 1;

// Check input buffer length.
// If too small, indicate the proper size and set last error.

if ( bufSize < size )
{
SetLastError( ERROR_INSUFFICIENT_BUFFER );
return FALSE;
}

// Add 'S' prefix and revision number to the string.

size = wsprintf( buf, "S-%lu-", dwSidRev );
p = buf + size;

// Add SID identifier authority to the string.

if ( psia->Value[0] != 0 || psia->Value[1] != 0 )
{
n = wsprintf( p, "0x%02hx%02hx%02hx%02hx%02hx%02hx",
(USHORT) psia->Value[0], (USHORT) psia->Value[1],
(USHORT) psia->Value[2], (USHORT) psia->Value[3],
(USHORT) psia->Value[4], (USHORT) psia->Value[5] );
size += n;
p += n;
}
else
{
n = wsprintf( p, "%lu", ( (ULONG) psia->Value[5] ) +
( (ULONG) psia->Value[4] << 8 ) + ( (ULONG) psia->Value[3] << 16 ) +
( (ULONG) psia->Value[2] << 24 ) );
size += n;
p += n;
}

// Add SID subauthorities to the string.

for ( i = 0; i < dwSubAuthorities; ++ i )
{
n = wsprintf( p, "-%lu", *GetSidSubAuthority( ps, i ) );
size += n;
p += n;
}

return TRUE;
}


PM MAIL   Вверх
Pakshin A. S.
Дата 5.4.2004, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



А есть ли в Delphi GetSidSubAuthorityCount(), GetSidSubAuthority() и т. п.?

PM   Вверх
NiJazz
Дата 5.4.2004, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Pakshin A. S.
Функции содержатся в Windows.h, соответственно, если написать uses Windows, то работать должны.
PM MAIL   Вверх
SlaUr
Дата 5.4.2004, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



NiJazz Для меня проблема вообще перевести код с Си,например полная загадка wsprintf или char *p; это что p:pchar и еще что-то у меня не получалось с переводом.

PM MAIL   Вверх
NiJazz
Дата 5.4.2004, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



char *p - это указатель на строку. Аналог PChar, кажется. Точнее, PChar - аналог того. smile.gif
wsprintf - функция, форматирующая строку. Судя по описанию, служит для помощи в работе с буфером. Только как и для чего, трудно понять за 3 минуты. Но вот я попробовал поработать с ней:
Код
#include <windows.h>
#include <iostream.h>

void main()
{
  сhar *s = (char*)malloc(100);
  char *s1 = "First";
  char *s2 = "Second";
  wsprintf(s, s2, s1);
  cout << s << endl;
  free(s);
}

В результате в s кидается значение s2. Но если в аргументах s1 и s2 поменять местами, то в s запишется значение s1.
Тут ты должен сориентироваться исходя из самой задачи. А вот тебе ссылочка ещё:
http://www.delphikingdom.ru/asp/viewitem.a...ury/wsprint.htm
Удачи!
PM MAIL   Вверх
p0s0l
Дата 5.4.2004, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Когда-то уже переводил этот пример на Delphi (а это из MSDN'а пример), откопал:
Код

var
 ida : Windows.PSIDIdentifierAuthority;
 l, subs : cardinal;
 s : string;

begin
 ida := GetSidIdentifierAuthority(sid);
 subs := GetSidSubAuthorityCount(sid)^;

 s := 'S-' + IntToStr(sid.Revision) + '-';
 if (ida.Value[0] <> 0) or (ida.Value[1] <> 0) then
 begin
   s := s + '0x';
   for l := 0 to 5 do
     s := s + IntToHex(ida.value[l], 2);
 end
 else
 begin
   s := s + IntToStr( ida.value[5] +
                      (ida.value[4] shl 8) +
                      (ida.value[3] shl 16) +
                      (ida.value[2] shl 24));
 end;

 for l := 0 to subs-1 do
   s := s + '-' + IntToStr(GetSidSubAuthority(sid, l)^);

<<<  ! s = SID ! >>>

end;

Добавлено @ 11:43
Цитата
но дело в том что в 9x виндах этой библиотеки нет

В 9x вообще нет никакого Security API, SID-ов и т.п., в том числе и функции LookupAccountSid, так что непонятно, как у тебя прога вообще запустилась...



--------------------
С уважением, г-н Посол.
PM   Вверх
SlaUr
Дата 5.4.2004, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



p0s0l Прога запускается (показывается только UserName)


PM MAIL   Вверх
p0s0l
Дата 5.4.2004, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата(SlaUr @ 5.4.2004, 11:48)
p0s0l Прога запускается (показывается только UserName)

GetUserName потому что есть во всех виндах...
Ну а что ты будешь делать с SID-функциями в 9x ?



--------------------
С уважением, г-н Посол.
PM   Вверх
SlaUr
Дата 5.4.2004, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



p0s0l
Цитата
Ну а что ты будешь делать с SID-функциями в 9x ?

Вобще то мне этот SID нужен только для того чтобы писать в реестр в раздел HKEY_USERS моя процедура должна под 2000,XP писать в раздел
HKEY_USERS\_SID_\SOFTWARE....
а в 9x виндах в раздел HKEY_USERS\.DEFAULT\SOFTWARE....
Это нужно для моей "Меню игр"Ссылка потому что например Warcraft III имено так и делает (а менюшка должна по идее иметь средства для инсталляции любой игры)

PM MAIL   Вверх
SlaUr
Дата 5.4.2004, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



p0s0l Пробую компилировать : На sid.Revision - ошибка .



Это сообщение отредактировал(а) SlaUr - 5.4.2004, 14:59
PM MAIL   Вверх
p0s0l
Дата 5.4.2004, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



В var-ах объявил sid : PSID; ?
sid - это то, что возвращает LookupAccountSid...

Цитата
Вобще то мне этот SID нужен только для того чтобы писать в реестр в раздел HKEY_USERS моя процедура должна под 2000,XP писать в раздел
HKEY_USERS\_SID_\SOFTWARE....
а в 9x виндах в раздел HKEY_USERS\.DEFAULT\SOFTWARE....
Это нужно для моей "Меню игр"Ссылка потому что например Warcraft III имено так и делает (а менюшка должна по идее иметь средства для инсталляции любой игры)

Тогда вообще забудь про эту фигню.
Есть ведь ключ HKEY_CURRENT_USER - копия ветки HKEY_USERS\_SID_
где _SID_ - SID текущего юзера.

Т.е. если создашь такой ключ:
HKEY_CURRENT_USER\Software\SlaUrTurboMegaSoftware\SuperPuperProgram
то одновременно "создастся" такой ключ:
HKEY_USERS\_SID_\Software\SlaUrTurboMegaSoftware\SuperPuperProgram
В 9x вместо _SID_ - имя текущего юзера вроде, т.к. там нет сид'ов...


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 5.4.2004, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



А можешь вообще писать в HKEY_LOCAL_MACHINE\Software - это для всех юзеров будет.
Или же: если ты в 9x пишешь в HKEY_USERS\.Default, то в 2k/XP есть точно такой же путь...



--------------------
С уважением, г-н Посол.
PM   Вверх
SlaUr
Дата 5.4.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



Вы меня не совсем поняли Я не могу выбрать куда мне записывать .

В моем меню игр существует специальный формат файла с расширением .regs он по формату не отличается от стандартного reg только добавлены строки например $long$ заменяется на путь где находится игра.
При иследовании Warcraft III я обнаружил что он по разному пишет в реестр под 9x и NT (см месагу выше )(не знаю зачем она так делает - действительно есть же HKEY_CURRENT_USER) вот я и хочу добавить еще один формат в .regs - $sid$
И тогда меню игр при встрече этой строки будет заменять на SID в NT и
'.DEFAULT' в 9x . .
Вот пример того как может выглядеть файл .regs:

Код

REGEDIT4

[HKEY_USER\$sid$\SOFTWARE\WARCRAFT III]
"path"="$long$\\warcarft.exe "



p0s0l
Цитата
В var-ах объявил sid : PSID; ?


Да конечно

Это сообщение отредактировал(а) SlaUr - 5.4.2004, 17:22
PM MAIL   Вверх
SlaUr
Дата 5.4.2004, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



В общем проблема сейчас остается только с Sid.Revision (остальной код
приведенный p0s0l работает (спасибо ему еще раз)

Посмотрел в 2000 и XP везде этот параметр=1 ,может пока програмисты из microsoft не поменяли этот параметр забить на это и просто вставлять '1' или все же кто-нибудь подскажет как правильно определить этот Revision.

Это сообщение отредактировал(а) SlaUr - 5.4.2004, 17:13
PM MAIL   Вверх
p0s0l
Дата 6.4.2004, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Ну да, Revision щас 1. Если сменится Revision, то остальная часть построения строкового Sid будет неправильной скорее всего (поэтому предпочтительнее та специальная функция)...

А с SID я понял - в Windows.pas он объявлен просто как Pointer, а я юзал JediWinAPI, там он расписан по-подробнее. Можешь сам добавить это:
Код
type
 PSID_IDENTIFIER_AUTHORITY = ^SID_IDENTIFIER_AUTHORITY;
 {$EXTERNALSYM PSID_IDENTIFIER_AUTHORITY}
 _SID_IDENTIFIER_AUTHORITY = record
   Value: array [0..5] of Byte;
 end;
 {$EXTERNALSYM _SID_IDENTIFIER_AUTHORITY}
 SID_IDENTIFIER_AUTHORITY = _SID_IDENTIFIER_AUTHORITY;
 {$EXTERNALSYM SID_IDENTIFIER_AUTHORITY}
 TSidIdentifierAuthority = SID_IDENTIFIER_AUTHORITY;
 PSidIdentifierAuthority = PSID_IDENTIFIER_AUTHORITY;

 PSid = ^SID;
 _SID = record
   Revision: Byte;
   SubAuthorityCount: Byte;
   IdentifierAuthority: SID_IDENTIFIER_AUTHORITY;
   SubAuthority: array [0..ANYSIZE_ARRAY - 1] of DWORD;
 end;
 {$EXTERNALSYM _SID}
 SID = _SID;
 {$EXTERNALSYM SID}
 PPSID = ^PSID;
 {$NODEFINE PPSID}
 TSid = SID;

Хотя если дело чисто в Revision, то можешь вместо строки:
s := 'S-' + IntToStr(sid.Revision) + '-';
написать такую:
s := 'S-' + IntToStr(PByte(sid)^) + '-';



--------------------
С уважением, г-н Посол.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0762 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.