На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья! Поздравляем вас с наступающим Новым 2026 годом!

Всем удачи, успеха и благополучия!

msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Получение имени пользователя процесса
    Или как получить имя пользователя, который запустил определенный процесс. Сий код выводит все запущенные процессы и имена пользователей, их запустивших.

    ExpandedWrap disabled
      Option Explicit
       
      Private Declare Function WTSEnumerateProcessesA Lib "wtsapi32.dll" (ByVal hServer As Long, ByVal Reserved As Long, _
      ByVal Version As Long, ppProcessInfo As Long, pCount As Long) As Long
      Private Declare Function WTSFreeMemory Lib "wtsapi32.dll" (ByVal pMemory As Long) As Long
      Private Declare Function lstrlenA Lib "kernel32.dll" (ByVal lpszString As Any) As Long
      Private Declare Function CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (CopyTO As Any, CopyFROM As Any, _
      ByVal dwBytes As Long) As Long
      Private Declare Function LookupAccountSidA Lib "advapi32.dll" (ByVal lpSystemName As Any, ByVal Sid As Long, _
      ByVal name As String, cbName As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, _
      peUse As Integer) As Long
       
      Private Type WTS_PROCESS_INFO
          SessionId As Long
          ProcessId As Long
          pProcessName As Long
          pUserSid As Long
      End Type
       
      Sub OutProcList()
      Dim w As WTS_PROCESS_INFO, pCount As Long, pVoid As Long, pVoid0, s As String, k As Integer, i As Long
      If WTSEnumerateProcessesA(0, 0, 1, pVoid0, pCount) <> 0 Then
          Dim lpszDomain As String, lpszUsername As String, cbDomain As Long, cbUsername As Long
          pVoid = pVoid0
          For i = 0 To pCount - 1
          CopyMemory w, ByVal pVoid, Len(w)
          cbDomain = 260: cbUsername = 260: lpszDomain = String(cbDomain, 0): lpszUsername = String(cbUsername, 0)
          If LookupAccountSidA(0&, w.pUserSid, lpszUsername, cbUsername, lpszDomain, cbDomain, k) <> 0 Then
              lpszDomain = Left(lpszDomain, cbDomain)
              lpszUsername = Left(lpszUsername, cbUsername)
          Else
              lpszDomain = "<Unknown>"
              lpszUsername = "<Unknown>"
          End If
          
          s = String(lstrlenA(w.pProcessName), 0)
          If Len(s) > 0 Then CopyMemory ByVal s, ByVal w.pProcessName, Len(s)
          Debug.Print s; " - "; lpszDomain & "\" & lpszUsername
          pVoid = pVoid + Len(w)
          Next
          WTSFreeMemory pVoid0
      Else
          MsgBox "Failed with error: " & CStr(Err.LastDllError), vbCritical
      End If
      Unload Me
      End Sub


    В FAQ предлагаю. :)
    Сообщение отредактировано: ALXR -
      хм... в debug window вроде чтото выводит, а потом вылетает назад в IDE...
      вешал вызов процедуры на Command1_Click()
      Сообщение отредактировано: Seriy-Coder -
        В debug и делается вывод. :) Убери в конце Unload me, чтобы не завершалось. :)

        Вообще, рекомендуется к прочтению. Вот эта функция еще интересна. :whistle:
        Сообщение отредактировано: ALXR -
          Цитата ALXR @
          В FAQ предлагаю.


          Меня смущает использование lstrlenA. Зачем?
            ExpandedWrap disabled
              Private Declare Function LookupAccountSidA Lib "advapi32.dll" (ByVal lpSystemName As Any, ByVal Sid As Long, _
              ByVal name As String, cbName As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, _
              peUse As Integer) As Long


            Цитата

            'peUse
            '[out] Pointer to a variable that receives a SID_NAME_USE value that indicates the type of the account.


            раз это поинтер то имхо надо переправлять на peUse As Long ;)

            И спасибо, - приятное решение.

            P.S.
            И еще, вы накручиваете поинтер pVoid для извлечения WTS-структур,
            следовательно WTSFreeMemory будет чистить только последний кусок(структуру последнего процесса выделенного буфера.
            Имхо надо сохранять первоначальное значения для WTSFreeMemory,
            а цикле накручивать копию pVoid.
            Сообщение отредактировано: AlexJ -
              Цитата AlexJ @
              раз это поинтер то имхо надо переправлять на peUse As Long
              Вы состоите в секте змия?
              ALXR
              WTS API? Хм, а как поводет себя твоя прога если её запустить на удаленном сеансе?
              Сообщение отредактировано: ANDLL -
                Цитата ANDLL @
                Цитата AlexJ @
                раз это поинтер то имхо надо переправлять на peUse As Long
                Вы состоите в секте змия?

                :blink:

                А по русски? Не догнал смысла :)
                  Цитата B.V. @
                  Меня смущает использование lstrlenA. Зачем?

                  Как это зачем? Я же не знаю длину строки, на которую имею поинтер.

                  Цитата ANDLL @
                  ALXR
                  WTS API? Хм, а как поводет себя твоя прога если её запустить на удаленном сеансе?

                  Понятия не имею. Эту же технологию использует обычный виндововский таск-менеджер.

                  Добавлено
                  Цитата AlexJ @
                  P.S.
                  И еще, вы накручиваете поинтер pVoid для извлечения WTS-структур,

                  Прав! Fixed.
                    Цитата ALXR @
                    обычный виндововский таск-менеджер
                    Откуда такая инфа?

                    Добавлено
                    Вот, кусок исходников.
                    ExpandedWrap disabled
                      HRESULT CProcPage::GetProcessInfo()
                      {
                          HRESULT  hr = S_OK;
                          NTSTATUS status;
                       
                          while(hr == S_OK)
                          {
                              if (m_pvBuffer)
                              {
                                  status = NtQuerySystemInformation(SystemProcessInformation,
                                                                    m_pvBuffer,
                                                                    m_cbBuffer,
                                                                    NULL);
                       
                                  //
                                  // If we succeeded, great, get outta here.  If not, any error other
                                  // than "buffer too small" is fatal, in which case we bail
                                  //
                       
                                  if (NT_SUCCESS(status))
                                  {
                                      break;
                                  }
                       
                                  if (status != STATUS_INFO_LENGTH_MISMATCH)
                                  {
                                      hr = E_FAIL;
                                      break;
                                  }
                              }
                       
                              //
                              // Buffer wasn't large enough to hold the process info table, so resize it
                              // to be larger, then retry.
                              //
                       
                              if (m_pvBuffer)
                              {
                                  VirtualFree(m_pvBuffer, 0, MEM_RELEASE);
                                  m_pvBuffer = NULL;
                              }
                       
                              m_cbBuffer += PROCBUF_GROWSIZE;
                       
                              m_pvBuffer = VirtualAlloc (NULL,
                                                         m_cbBuffer,
                                                         MEM_COMMIT,
                                                         PAGE_READWRITE);
                              if (m_pvBuffer == NULL)
                              {
                                  hr = E_OUTOFMEMORY;
                                  break;
                              }
                          }
                       
                          return hr;
                      }
                    Таки taskmanager пользуется функцией NtQuerySystemInformation
                      ANDLL,

                      Может все таки проясните по поводу секты змия и скольки байтам равняется любой поинтер в 32 - разрядной системе ?
                        Цитата ANDLL @
                        Откуда такая инфа?

                        У тебя есть исходник таск-манагера из Windows XP ? Насколько я помню, в WinNT4.0 и Win2k нету возможности просмотра имени пользователя, от которого запущен процесс. Ага?
                        И инфа сия из дизасма ХРшного таск-манагера исходит.

                        AlexJ, поинтер, конечно, имеет размер 32 бита, но этот поинтер может указывать на что угодно, включая переменную типа Integer. ;)
                        Сообщение отредактировано: ALXR -
                          Цитата ALXR @
                          У тебя есть исходник таск-манагера из Windows XP ?
                          Нет, но есть исходники 2k'шного, их я и привел.
                          В XP, говоришь по другому? Проверять не буду, поверю на слово.
                            Цитата ANDLL @
                            Нет, но есть исходники 2k'шного, их я и привел.
                            В XP, говоришь по другому? Проверять не буду, поверю на слово.

                            Ну ты бы хоть посмотрел бы, извлекает он там где-нибудь имя пользователя или нет, а то привел совершенно посторонний по отношению к теме кусок кода из программы совершенно другой версии и еще возмущаешься, что автор не прав!

                            За что боролося, на то и напоролся. ;)

                            PS: В ХР, кстати, тоже HRESULT CProcPage::GetProcessInfo так выглядит (ну или почти так).
                            Сообщение отредактировано: ALXR -
                              Цитата ALXR @
                              За что боролося, на то и напоролся
                              В общем то меня это не смущает ;)
                              Сообщение отредактировано: ANDLL -
                                Переменная i не объявлена, код не работает - возвращает "Failed with error: 1151".
                                  Цитата B.V. @
                                  Переменная i не объявлена, код не работает - возвращает "Failed with error: 1151".

                                  Теперь объявлена.

                                  Вообще, странная ошибка:
                                  Цитата

                                  Указанная программа не является программой для Windows или MS-DOS.


                                  Цитата MSDN

                                  Requirements
                                  Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
                                  Server Requires Windows Server "Longhorn", Windows Server 2003, or Windows 2000 Server.

                                  Т.к. в XP работает, то и в Win2k должно работать (и, кстати, работает!).
                                    Цитата ALXR @
                                    и, кстати, работает!


                                    Рад за тебя.
                                    Для справки: у меня Win2k SP4 EN, версия Wtsapi32.dll - 5.0.2134.1, вирусов нет.
                                      Таки я опять был не прав, через удаленный стол то же работает
                                        BV: Может, какая библиотека убита? Судя по ошибке, не может подгрузить какую-то длл из импорта, поскольку она "Не Виндовс и не МС-ДОС формата" (могу и ошибаться). К примеру: WINSTA.dll.
                                          Цитата ALXR @
                                          Может, какая библиотека убита?


                                          Все на месте, все работают.
                                            Цитата B.V. @
                                            Все на месте, все работают.

                                            Попробуйте скомпилиный вариант на ПБшке
                                            Прикреплённый файлПрикреплённый файлGetUsersNamesOfProcesses.zip (5.7 Кбайт, скачиваний: 4200)
                                              Цитата AlexJ @
                                              Попробуйте скомпилиный вариант на ПБшке


                                              Цитата
                                              ---------------------------
                                              AlexJ@src
                                              ---------------------------
                                              Failed with error: 1151
                                              ---------------------------
                                              OK
                                              ---------------------------
                                                B.V.: Ссылка. Видимо, "повезло" тебе с ОС... :unsure: Проблема, как выяснилось в бажной(?) winsta.dll.
                                                Там везде примерно такой код:
                                                ExpandedWrap disabled
                                                  :655F2FEB A124A05F65              mov eax, dword ptr [655FA024]
                                                  :655F2FF0 83F8FD                  cmp eax, FFFFFFFD
                                                  :655F2FF3 750F                    jne 655F3004
                                                  :655F2FF5 687F040000              push 0000047F
                                                   
                                                  * Reference To: KERNEL32.SetLastError, Ord:02A0h
                                                                                    |
                                                  :655F2FFA FF1528105F65            Call dword ptr [655F1028]

                                                Что там по адресу [655FA024] выяснить не удалось...
                                                Сообщение отредактировано: ALXR -
                                                  может попробовать просто WTS библиотеки с хрюшки подкинуть взамен w2k-шных?
                                                  Я помнится так комон контролы лечил...успешно на w2k
                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                  0 пользователей:


                                                  Рейтинг@Mail.ru
                                                  [ Script execution time: 0,0726 ]   [ 16 queries used ]   [ Generated: 31.12.25, 12:22 GMT ]