Re[5]: Запуск Outlook Express из сервиса (Win2000).
От: Alex Fedotov США  
Дата: 05.02.02 17:28
Оценка: 13 (2)
Здравствуйте Вячеслав Мишуров, Вы писали:

ВМ>Правда одна проблема осталась: 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;
}
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.