Re: Можно ли в драйвере получить имя юзера?
От: _cb_  
Дата: 20.11.03 10:45
Оценка: 28 (4)
Здравствуйте, Crag, Вы писали:

C>Есть IRP. По нему получаем процесс.

C>С процессом жестко связано имя пользователя.
C>Есть ли способ получить это имя? Если нет, то, может быть есть какие-либо обходные пути?
C>Заранее спасибо...

можно получить SID пользователя:


ULONG 
KQueryPrimarySidByProcess (
   IN void* pSid, 
   IN ULONG dwSidLength,
   IN PEPROCESS pEProcess
   )
{
  if (
      pEProcess == NULL ||
      KeGetCurrentIrql() != PASSIVE_LEVEL
     )
    return 0;

  ULONG    dwSidLengthReal = 0;
  HANDLE   hToken = NULL;
  NTSTATUS NtStatus;

  void* pToken = PsReferencePrimaryToken(pEProcess);
  if (pToken != NULL)
  {
    NtStatus = ObOpenObjectByPointer(pToken, 0, 0, TOKEN_QUERY, 0, KernelMode, &hToken);
    if (NT_SUCCESS(NtStatus)) 
    {
      ULONG dwSizeOfToken = 0;
      NtStatus = ZwQueryInformationToken(hToken, TokenUser, NULL, 0, &dwSizeOfToken);
      if (NtStatus == STATUS_BUFFER_TOO_SMALL)
      {
        PTOKEN_USER pTokenUser = (PTOKEN_USER) new char[dwSizeOfToken];
        if (pTokenUser != NULL)
        {
          NtStatus = ZwQueryInformationToken(hToken, TokenUser, pTokenUser, dwSizeOfToken, &dwSizeOfToken);
          if (NT_SUCCESS(NtStatus)) 
          {
            if (RtlValidSid(pTokenUser->User.Sid) == TRUE)
            {
              dwSidLengthReal = RtlLengthSid(pTokenUser->User.Sid);
              if (dwSidLengthReal != 0 && dwSidLengthReal <= dwSidLength && pSid != NULL)
              {
                RtlCopySid(dwSidLengthReal, pSid, pTokenUser->User.Sid);
              }
            }
          }
          delete[] (char*) pTokenUser;
        }
      }
      ZwClose(hToken);
    }

    ObDereferenceObject(pToken);
  }
    
  return dwSidLengthReal;
}


cb.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.