Здравствуйте Вячеслав Мишуров, Вы писали:
ВМ>Правда одна проблема осталась: OE запускается с настройками и адресной книгой
ВМ>нужного пользователя, а вот каталог с папками берет для default user.
Environment? Насколько я понимаю, запущенный тобой OE сейчас отличается от обычного только переменными окружения.
ВМ>Нужно получить SID залогиненого пользователя?
ВМ>(GetTokenInformation для ранее полученного токена и еще что-то? LookupAccountSid?)
ВМ>А после получения SID ?
Чтобы корректно установить environment (не знаю, насколько это поможет проблеме, но в голову ничего больше не приходит) нужно перечислить переменные вот в этих ключах
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
HKEY_USERS\<user-sid>\Environment
HKEY_USERS\<user-sid>\Volatile Environment
и объединить их. Это достаточно кропотливая задача, потому что нужно аккуратно склеить переменные PATH, а также развернуть все переменные REG_EXPAND_SZ.
Чтобы получить SID в двоичной форме, достаточно GetTokenInformation(hToken, TokenUser, ...). Чтобы преобразовать его в строку можно воспользоваться функцией ConvertSidToStringSid, но она есть только на Win2K и старше. На NT 4.0 несложно написать заменитель:
//---------------------------------------------------------------------------
// ConvertSidToTextSid
//
// Converts a binary SID to the string representation. On Win2K and later
// you can use the ConverSidToStringSid function for that. This function
// works on all platforms.
//
// Parameters:
// pSid - pointer to the SID
// pszSid - pointer to a buffer that receives the text SID
// cchSid - size of the buffer in characters
//
// Returns:
// TRUE, if successful, FALSE - otherwise.
//
EXTERN_C
BOOL
APIENTRY
ConvertSidToTextSid(
IN PSID pSid,
OUT PTSTR pszSid,
IN ULONG cchSid
)
{
_ASSERTE(pSid != NULL);
_ASSERTE(IsValidSid(pSid));
_ASSERTE(pszSid != NULL);
*pszSid = 0;
PSID_IDENTIFIER_AUTHORITY pSia;
ULONG cAuthorities;
ULONG cch;
pSia = GetSidIdentifierAuthority(pSid);
cAuthorities = *GetSidSubAuthorityCount(pSid);
cch = (15 + 12 + (12 * cAuthorities) + 1) * sizeof(TCHAR);
if (cch >= cchSid)
return SetLastError(ERROR_INSUFFICIENT_BUFFER), FALSE;
pszSid += wsprintf(pszSid, _T("S-%lu-"), ((SID *)pSid)->Revision);
if (pSia->Value[0] != 0 || pSia->Value[1] != 0)
{
pszSid += wsprintf(pszSid,
_T("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]);
}
else
{
pszSid += wsprintf(pszSid, _T("%lu"),
(ULONG)(pSia->Value[5])
| (ULONG)(pSia->Value[4] << 8)
| (ULONG)(pSia->Value[3] << 16)
| (ULONG)(pSia->Value[2] << 24));
}
for (ULONG i = 0; i < cAuthorities; i++)
{
pszSid += wsprintf(pszSid, _T("-%lu"),
*GetSidSubAuthority(pSid, i));
}
return TRUE;
}