Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2012, 13:27   #1
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию Процессы и их создатели

Код:
function GetNamebySID(destSystem: PChar; sid: PSID):PChar;
var
  _userName : PChar;
  _Domain: PChar;
  _Needed : DWORD;
  _DomLen : DWORD;
  _use  : SID_NAME_USE;
begin
  Result := 0;
  _Needed := 0;
  _DomLen := 0;
  LookupAccountSid(destSystem, sid, 0, _Needed, 0, _DomLen,  _use);

  if GetLastError() = ERROR_INSUFFICIENT_BUFFER then
   begin
    Result := HeapAlloc(GetProcessHeap(), 0, _Needed);
    _Domain:= GetMemory(_DomLen);
    LookupAccountSid(destSystem, sid, Result, _Needed, _Domain, _DomLen, _use);
    FreeMemory(_Domain);
   end;
end;

function GetProcessUserName(Process:THandle):PChar;
var
  _Token:THandle;
  _Info:PTOKEN_USER;
  _Needed:DWORD;
begin
  Result:=0;
  if not OpenProcessToken(Process, TOKEN_QUERY, _Token) then exit;
  _Needed:=0;
  GetTokenInformation(_Token, TokenUser, 0, 0, _Needed);
  if GetLastError() = ERROR_INSUFFICIENT_BUFFER then
   begin
    _Info := HeapAlloc(GetProcessHeap(), 0, _Needed);
    if GetTokenInformation(_Token, TokenUser, _Info, _Needed, _Needed) then
     Result:=GetNamebySID(0, _Info^.User.Sid);
    HeapFree(GetProcessHeap(),0, _Info);
   end;
end;
Вот нашел функцию, но разобраться не могу при компиляции ошибка где то в месте выделенным красным.
Но задача в целом вот в чем...у меня каждую ночь программа делает бэкапы, но к сожалению она бессильна когда приложение открыто хотя бы у одного из пользователей терминального сервера, так вот мне нужно получать информацию о том кем запущен висящий процесс(чтобы карать тех кто забыл выключить), подскажите пожалуйста решение
alekola вне форума Ответить с цитированием
Старый 31.05.2012, 14:07   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

а не проще переписать приложение так, чтобы файлы создавались/открывались с FILE_SHARE_READ? Тогда бэкап без проблем сможет их прочитать.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 31.05.2012, 15:40   #3
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию

извиняюсь что сразу не дополнил, бэкапится не мое приложение, а 1ски
alekola вне форума Ответить с цитированием
Старый 31.05.2012, 18:35   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

может тогда его (процесс) проще прибить?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.06.2012, 05:00   #5
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию

Если прибивать процесс то слишком увеличивается вероятность повреждения базы =\
alekola вне форума Ответить с цитированием
Старый 01.06.2012, 10:38   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А если ему нежно послать сообщение WM_QUIT? Или программно нажать пункт меню File - Exit?
Имхо, это будет эффективней, чем вывешивать имена нерадивых юзеров на доску позора.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 04.06.2012, 15:08   #7
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию

Эм, а есть какие то нюансы? или просто ищю в цикле по имени процеса - аккуратно выхожу.
И все таки как определить имя пользователя запустившего процесс, тоже хотелось бы узнать
alekola вне форума Ответить с цитированием
Старый 05.06.2012, 21:33   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

попробуйте поменять проблемную строчку на такую:

Код:
  _Info: ^TOKEN_USER;
после этого код по крайней мере компилится. Рабоатает он или нет, хз.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процессы Bat{CMD}_Men Win Api 5 03.10.2009 12:27
::Процессы:: doniyor Общие вопросы Delphi 5 07.01.2009 09:16
Процессы v.korleone Помощь студентам 1 16.12.2008 16:24
процессы lelik3000 Win Api 2 23.10.2008 09:04