powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запретить запуск программы два раза
53 сообщений из 53, показаны все 3 страниц
Запретить запуск программы два раза
    #39635162
minva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой код работает, но если войти на комп удаленно под другим пользователем , то программу запустить можно.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
 MuxHandle := CreateMutex(nil, false, pchar('XXX' + ParamStr(1) + '.mux'));
  if GetLastError() = ERROR_ALREADY_EXISTS then
  begin
    ShowError('Повторный запуск!');
    CloseHandle(MuxHandle);
    ExitProcess(1)
  end;



Если написать так (если я правильно понял MSDN)
Код: pascal
1.
MuxHandle := CreateMutex(nil, false, pchar('Global\XXX' + ParamStr(1) + '.mux'));


то GetLastError() вообще 0 возвращает, программу тогда можно запустить и под одним пользователем два раза.

Собственно вопрос. Какой флаг нужно выбросить в систему, что программу нельзя было запустить два раза на компьютере?
Предложение сделать сервис рассматривается, но там есть другие проблемы.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635185
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Влияние на другого пользователя - это то, что должны и могут делать только администраторы, а не обычные пользователи.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635209
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример на С (WinAPI), переделать не трудно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
  public:
    typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);
    typedef BOOL (WINAPI *PROCESSWALK)(HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
  private:
    PROCESSWALK _pProcess32First;
    PROCESSWALK _pProcess32Next;
    CREATESNAPSHOT _pCreateToolhelp32Snapshot;

    HINSTANCE  hKernel = NULL;
    HANDLE         hProcessSnap = NULL;
    PROCESSENTRY32 pe32;
    WFilePath       path;
    WInt    flag;

    flag=0;

    hKernel = (HINSTANCE) GetModuleHandle("KERNEL32.DLL");
    _pCreateToolhelp32Snapshot = (CREATESNAPSHOT)GetProcAddress(hKernel,"CreateToolhelp32Snapshot");
    _pProcess32First = (PROCESSWALK)GetProcAddress(hKernel,"Process32First");
    _pProcess32Next  = (PROCESSWALK)GetProcAddress(hKernel,"Process32Next");

    hProcessSnap = _pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(hProcessSnap == (HANDLE)-1)
      return false;

    pe32.dwSize = sizeof(PROCESSENTRY32);

    if(_pProcess32First(hProcessSnap,&pe32)) 
      do
      {
        path = pe32.szExeFile;
        if(path=="XXXXXX.exe")     // имя процесса (программы)
        {
          flag+=1;
          if(flag>1)
          {
            WMessageBox::Info(NULL, "Внимание !!!", "Запуск второго экземпляра запрещен !");
            CloseHandle (hProcessSnap);
            FreeLibrary(hKernel);
            ExitProcess(0);
            Close();
            return false;
          }  
        }   
      }while(_pProcess32Next(hProcessSnap,&pe32));

      CloseHandle(hProcessSnap);
      FreeLibrary(hKernel);
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635216
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все запускаются с одного ЕХЕ, или может быть неск. копий ЕХЕ в юзерских папках ?
В общей папке можно создать и заблокировать некий файл.
Тогда попытка пересоздать файл другой копией закончится ошибкой. Как вариант.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635223
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я всё равно запущу несколько копий, на нескольких виртуалках. Если мне нужны несколько копий.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635240
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva,

ты на сравнивай с ERROR_ALREADY_EXISTS
Код: pascal
1.
 if GetLastError() = ERROR_ALREADY_EXISTS


- ты просто проверяй, не создался ли мьютекс.
Если такой юзер уже есть, мьютекс не будет создан.
И ParamStr(1) для генерации имени не используй: переименуют файл экзешника, и все.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635242
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrЯ всё равно запущу несколько копий, на нескольких виртуалках. Если мне нужны несколько копий.
Бывает, что нужна защита не от злоумышленника. Например, от повторного запуска приложения-сервера, которое слушает tcp порт.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635248
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНапример, от повторного запуска приложения-сервера, которое слушает tcp порт.

Обработка ошибки "port in use" от listen() за пределами способностей современных
программистов?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635259
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть вот такая реализация, может поможет.
//wrSession - Allow only one instance per login session
//wrDesktop - Allow only one instance on current desktop
//wrTrustee - Allow only one instance for current user
//wrSystem - Allow only one instance at all (on the whole system)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
unit uOnlyInstanceApplication;

interface

uses
  Winapi.Windows,
  System.SyncObjs;

type
//wrSession - Allow only one instance per login session
//wrDesktop - Allow only one instance on current desktop
//wrTrustee - Allow only one instance for current user
//wrSystem  - Allow only one instance at all (on the whole system)
  TWayToRun = (wrSystem, wrDesktop, wrSession, wrTrustee);

  TOnlyInstanceApplication = class
  private
    FMutex: TMutex;
    FName: string;
    FResult: DWORD;
    FWayToRun: TWayToRun;
    function CreateUniqueName: string;
  public
    constructor Create(aWayToRun: TWayToRun; const aName: string);
    destructor Destroy; override;
    function IsInstancePresent: Boolean;
  end;

implementation

uses
  System.SysUtils;

{ TOnlyInstanceApplication }

constructor TOnlyInstanceApplication.Create(aWayToRun: TWayToRun; const aName: string);
begin
  FWayToRun := aWayToRun;
  FName := aName;
  FMutex := TMutex.Create(nil, False, CreateUniqueName);
  FResult := GetLastError();
end;

function TOnlyInstanceApplication.CreateUniqueName: string;
var
  desktop: HDESK;
  len: DWORD;
  res: BOOL;
  resultError: DWORD;
  buffer, buffer2: TBytes;
  token: THandle;
  uid: LUID;
begin
  case FWayToRun of
    wrSystem:
      Result := FName;
    wrDesktop:
    begin
      desktop := GetThreadDesktop(GetCurrentThreadId());
      res := GetUserObjectInformation(desktop, UOI_NAME, nil, 0, len);
      resultError := GetLastError();
      if (not res) and (resultError = ERROR_INSUFFICIENT_BUFFER) then
      begin
        SetLength(buffer, len);
        GetUserObjectInformation(desktop, UOI_NAME, @buffer[0], len, len);
        Result := FName + '-' + PChar(@buffer[0]);
      end
      else
        Result := FName + '-Win9x';
    end;
    wrSession:
    begin
      res := OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, token);
      if res then
      begin
        GetTokenInformation(token, TokenStatistics, nil, 0, len);
        SetLength(buffer, len);
        GetTokenInformation(token, TokenStatistics, @buffer[0], len, len);
        uid := PTokenStatistics(@buffer[0]).AuthenticationId;
        Result := FName + Format('-%.8x%.8x', [uid.HighPart, uid.LowPart]);
      end
      else
        Result := FName;
    end;
    wrTrustee:
    begin
      SetLength(buffer, 255);
      if GetUserName(@buffer[0], len) then
      begin
        SetLength(buffer, len * 2);
        SetLength(buffer2, 255);
        len := ExpandEnvironmentStrings('%USERDOMAIN%', @buffer2[0], 255);
        SetLength(buffer2, len);
        Result := FName + Format('-%s-%s', [PChar(@buffer2[0]), PChar(@buffer[0])]);
      end
      else
        Result := FName;
    end;
  end;
end;

destructor TOnlyInstanceApplication.Destroy;
begin
  FMutex.Free();
  inherited Destroy();
end;

function TOnlyInstanceApplication.IsInstancePresent: Boolean;
begin
  Result := (FResult = ERROR_ALREADY_EXISTS) or (FResult = ERROR_ACCESS_DENIED);
end;

end.



Код: pascal
1.
2.
3.
4.
GUID_APPLICATION = '{11112222-3333-1111-4444-555566661111}';
FOnlyInstanceApplication := TOnlyInstanceApplication.Create(wrSystem, GUID_APPLICATION);
if FOnlyInstanceApplication.IsInstancePresent then
  атата
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635270
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovчччДНапример, от повторного запуска приложения-сервера, которое слушает tcp порт.

Обработка ошибки "port in use" от listen() за пределами способностей современных
программистов?..

Ну вот и расскажи про это своим друзьям-разработчикам фаерберда.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635311
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНу вот и расскажи про это своим друзьям-разработчикам фаерберда.

Firebird, в отличии от некоторых, работает по многим протоколам и проблемы с одним из них
- не повод отказываться работать вообще.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635333
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovчччДНу вот и расскажи про это своим друзьям-разработчикам фаерберда.

Firebird, в отличии от некоторых, работает по многим протоколам и проблемы с одним из них
- не повод отказываться работать вообще.


Странный метод общения. Ты отвечаешь на придуманные именно тобой якобы проблемы у собеседника.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635385
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДТы отвечаешь на придуманные именно тобой якобы проблемы у собеседника.Да нет, он имел ввиду проблемы в работе одного из протоколов Firebird после запуска.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635451
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДИ ParamStr(1) для генерации имени не используй: переименуют файл экзешника, и все.При чем здесь ParamStr(1) и имя экзешника?
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635453
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

да, это первый параметр, не имя модуля, ни при чем, лоханулся.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39635459
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minvaСобственно вопрос. Какой флаг нужно выбросить в систему, что программу нельзя было запустить два раза на компьютере?
Очевидно, использовать средства, независящие от контекста пользователя.
Можно просто файл лочить, а-ля BDE.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39637938
X-Cite,

Не хватает для текущей сети :-)

Как ведет под терминальным сервером?
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39638427
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда то использвоваль этот либ может поможет
http://www.loonies.narod.ru/t-one-instance.htm
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39645837
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minva,
Если еще актуально.
Функция проверки работающего приложения
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function IsRunPrg(sname: String): boolean;
// ПРОВЕРКА - ЗАПУЩЕННА ЛИ ЭТА ПРОГРАММА
var
  hMutex: integer;
  hW: hWnd;
BEGIN
  hMutex := CreateMutex(nil, TRUE, PChar(sname)); // Создаем семафор
  result := GetLastError <> 0; // семафор создан, можем работать
  if (result = TRUE) then
  begin
    hW := FindWindow(CLASS_FMAIN, nil);
    if (hW <> 0) then
      SenMsg(MSG_MYFRM, CLASS_FMAIN, OPR_SHOW_WND, '');
  end;
  ReleaseMutex(hMutex);
END;



В главном модуле
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
uses
  Forms,
  windows,
  SysUtils,
  uMain in 'uMain.pas' {Fmain},
  uUtils in 'uUtils.pas',
  uConst in 'uConst.pas',
....;
{$R *.res}
{$ifdef Debug}
{$ASSERTIONS ON}
{$else}
{$ASSERTIONS OFF}
{$endif}
var frm:TFSplash;
    StartD:TDateTime;
    YY,MM,DD,HH,MN,SS,MS:integer;
begin
  Application.MainFormOnTaskbar := True;
   try
     if( IsRunPrg(ExtractFileName(Application.ExeName))) then halt;
// иначе продолжаем нормальный старт программы



константы можно определить как угодно
в моём случае
Код: pascal
1.
2.
3.
CLASS_FMAIN  = 'TFmain';
MSG_MYFRM   = WM_USER + 4243;
OPR_SHOW_WND      = 1000;



стартуем приложение, если оно уже запущено - открывается/активируется работающее и останавливается запускаемое.

function IsRunPrg - у меня находится в отдельном модуле uUtils, в виде обычной функции без класса.
константы естественно в модуле uConst
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39645858
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2, предложенный код будет работать, если на этот же компьютер зайти удаленно и запустить программу другим пользователем ?
И если этот код будет работать при попытке запуска программы несколькими пользователями, то как вы будете активировать работающее приложение из другой сессии?
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39645994
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45,
Да, проверил. В одной сессии работает корректно. В разных - не "видит" запущенный экземпляр. Видимо, просто в API надо глубже залезть. :(
Возможно, переключение контекста или еще что.
Согласен.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646039
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2goldmi45,
Да, проверил. В одной сессии работает корректно. В разных - не "видит" запущенный экземпляр. Видимо, просто в API надо глубже залезть. :(
Возможно, переключение контекста или еще что.
Согласен.
Есть глобальный Mutex, а есть локальный.. решается префиксом

On a server that is running Terminal Services, a named system mutex can have two levels of visibility. If its name begins with the prefix "Global\", the mutex is visible in all terminal server sessions. If its name begins with the prefix "Local\", the mutex is visible only in the terminal server session where it was created. In that case, a separate mutex with the same name can exist in each of the other terminal server sessions on the server. If you do not specify a prefix when you create a named mutex, it takes the prefix "Local\". Within a terminal server session, two mutexes whose names differ only by their prefixes are separate mutexes, and both are visible to all processes in the terminal server session. That is, the prefix names "Global\" and "Local\" describe the scope of the mutex name relative to terminal server sessions, not relative to processes.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646055
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2,

мьютекс надо делать именованным и с приставкой Global, тогда будет видно везде.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646083
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonмьютекс надо делать именованным и с приставкой Global, тогда будет видно везде.Для создания глобального объекта может не хватить прав.

По теме - открывается сокет на прослушку у все. Второй сокет уже не откроется, а по сокету можно еще и команду послать
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646098
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, видно :) Ладно, может кому пригодится.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function ExistsPrg(sname: String): boolean;
var
  hMutex: integer;
  hW: hWnd;
BEGIN
  hW := 0;
  hMutex := CreateMutex(nil, TRUE, PChar('Global\'+sname)); 
  result := GetLastError <> 0; 
  if (result = TRUE) then
  begin
    hW := FindWindow(CLASS_FMAIN, nil); 
    if (hW <> 0) then
      SenMsg(MSG_MYFRM, CLASS_FMAIN, OPR_SHOW_WND, ''); // тут увы, пока между сессиями нет переключения.
  end;
  ReleaseMutex(hMutex);
END;
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646100
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_По теме - открывается сокет на прослушку у все. Второй сокет уже не откроется, а по сокету можно еще и команду послать
Как вариант, спасибо.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646104
По теме
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,открывается сокет на прослушку и ...может не хватить прав
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646151
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.05.2018 13:50, stells2 пишет:
Код: sql
1.
>   if (result = TRUE) then



ах, кАкая прЭлесть!!!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646156
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это классика. :)
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646168
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,
А что вы хотели, когда кому то надо показать что оно действительно таки труе?
Ладно это еше паскаль, на С-подобных без жестких типов, там вообще многие в ступор входят, глядя на некоторые не объяснимые для них но такие простые вещи.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646169
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javascript в этом плане особенно "хорош".
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646193
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме_Vasilisk_,открывается сокет на прослушку и ...может не хватить правПример в студию. С какой ошибкой отваливается bind на адрес 127.0.0.1?
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646211
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_С какой ошибкой отваливается bind на адрес 127.0.0.1?
Не знаю (в контексте прав).
Но вот в случае, если кто-то уже поднял сервер на этом адресе, то подозреваю, что случится "Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт) (10048)"
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646222
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_По теме - открывается сокет на прослушку у все. Второй сокет уже не откроется, а по сокету можно еще и команду послатьМожет и первый не открытся.
Есть не нулевые шансы что данный сокет кто-то до вас уже открыл. ;)
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646224
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockНо вот в случае, если кто-то уже поднял сервер на этом адресе, то подозреваю, что случится "Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт) (10048)"Правильно. На этом и основана проверка уникальности. Наша задача - выбрать уникальный порт
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646227
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_makhaonмьютекс надо делать именованным и с приставкой Global, тогда будет видно везде.Для создания глобального объекта может не хватить прав.
SECURITY_DESCRIPTOR надо создать просто.
Как вариант:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
function CreateGlobalEvent: THandle;
var
  pSD: PSECURITY_DESCRIPTOR;
  sa: SECURITY_ATTRIBUTES;
begin
  Result := 0;
  pSD := PSECURITY_DESCRIPTOR( LocalAlloc( LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH ) );
  if not Assigned( pSD ) then
    Exit;

  try
    if not InitializeSecurityDescriptor( pSD, SECURITY_DESCRIPTOR_REVISION ) then
      Exit;

    if not SetSecurityDescriptorDacl( pSD, TRUE, PACL( nil ), FALSE ) then
      Exit;

    sa.nLength := sizeof( sa );
    sa.lpSecurityDescriptor := pSD;
    sa.bInheritHandle := TRUE;

    Result := CreateEvent( @sa, True, True, 'Global\MyGlobalEventName' );
  finally
    LocalFree( HLOCAL( pSD ) );
  end;
end;

...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646229
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Наша задача - выбрать уникальный порт
Ну вообще да, порт можно и в настройки вынести.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646254
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockпорт можно и в настройки вынести.
Обычно, так и делают, хотя - по топику, задача и так весьма специфична.
И это явно не вариант домашней машинки.
Честно говоря, в голову не приходит область применения, когда из разных сессий надо отслеживать. Есть примеры?

А в одной сессии - так выше уже решения простые есть, и, даже активация работающего приложения.
И тут уж действительно, может служба и проще?
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646257
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2И тут уж действительно, может служба и проще?Да, но так не интересно)
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646280
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа, но так не интересно)
Ради спортивного интереса - я только "ЗА" Лишний раз мозг наморщить - только плюсом к карме.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646466
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй этап - добиться переключения контекста, т.е. активации работающего приложения из другой сессии.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646506
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Второй этап - добиться переключения контекста, т.е. активации работающего приложения из другой сессии.Это не возможно сделать по разным причинам, т.ч. можно не начинать.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646549
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockstells2Второй этап - добиться переключения контекста, т.е. активации работающего приложения из другой сессии.Это не возможно сделать по разным причинам, т.ч. можно не начинать.
Почему? Если оно будет активироваться для того пользователя, который его запустил - возможно :)
Второй вариант: прибивать то с сохранением состояния и запускать новое для текущего пользователя с восстановлением состояния на момент закрытия.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646555
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Оба из этих прелестных варианта не решают задачу
stells2Второй этап - добиться переключения контекста, т.е. активации работающего приложения из другой сессии.
"работающего"
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646744
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockSECURITY_DESCRIPTOR надо создать просто.
Как вариант:Вот моя история борьбы с глобальными объектами.

Там все не просто.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646756
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Мне помог этот код 21417637 (для создания глобального Event. Может, не для всех объекта ядра так просто, но для Mutex думаю да)
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646818
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Нельзя установить больше прав чем есть у владельца запускаемого процесс, иначе, смысл в этой всей "безопасности"? Любая программа, с точки зрения Windows ничем не отличается от пользователя который её запускает.

Смешно было бы, если бы юзер с минимальными правами запускал системный самописный софт с админскими правами который позволял бы менять права у пользователя ;)
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646824
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Нельзя установить больше прав чем есть у владельца запускаемого процессМожно. Windows различает текущие права и максимально возможные права. Так у процесса может быть какая-то привилегия, но она может быть неактивна. Подробнее AdjustTokenPrivileges
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646845
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Сейчас нет возможности проверить, а память уже потерлась малость :)
Но, если при создании мьютекса использовать флаг 21417637 MUTEX_ALL_ACCESS - и запустить с минимальными правами пользователя?
В том примере не очень понятно, под каким пользователем запускалось приложение.
Допускаю, что права могут быть полными но только на порожденные объекты родительским процессом в рамках ACL, т.е. наследование и разрешения. Хотя, может для размещения в глобальном и допустимо.
В общем, вопрос интересный, но требует проверки. :)
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646846
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Любое приложение/процесс запускается изначально с правами пользователя его запустившего. И эти права повысить можно только обладая более высокими правами (если правильно обработать исключение, то будет выполнен запрос на повышение прав). Он может управлять только создаваемыми или наследуемыми объектами.
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646847
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_ Windows различает текущие права и максимально возможные права. Так у процесса может быть какая-то привилегия, но она может быть неактивна.
Прочел еще раз - мы об одном и том же
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646913
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Любое приложение/процесс запускается изначально с правами пользователя его запустившегоДа. Но часть прав будет в состоянии Disabled, а части прав не будет вообще
stells2И эти права повысить можно только обладая более высокими правамиНет. Disabled права можно перевести в Enabled. А вот при отсутствии прав уже сделать ничего нельзя, кроме как запуститься из под другого пользователя
stells2будет выполнен запрос на повышение правНе всегда. Смотря что и как запрашивать
...
Рейтинг: 0 / 0
Запретить запуск программы два раза
    #39646992
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Имелось ввиду, что если правильно обработать исключение (и правильно его создать), то можно вывести пользователю запрос о повышении прав.
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Запретить запуск программы два раза
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]