Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Блокировка Windows [Win2k]


m2003 ©   (2004-06-25 20:32:00) 

Хочу сделать программу которая будет запускаться вместо Explorer'а и все действия будут выполняться через неё. Сложность заключается в том что я не знаю как сделать так чтоб нельзя было делать никаких действий не через программу - то есть нужно чтоб она блокировала Windows. Например в Windows 2000 можно из TaskManager запустить программу - это не приемлемо.
Заранее спасибо.


Игорь Шевченко   (2004-06-28 17:40:00) [1]

Файл: DesktopShell.dpr

program DesktopShell;

uses
 Windows, Messages, Classes, SysUtils, ShellAPI, StdCtrls, Dialogs, Forms;

{$R *.res}

const
 C_ClubDesktop = 'ClubDesktop!';

type
 TTest = class(TComponent)
   procedure Close(Sender: TObject);
   procedure Open(Sender: TObject);
 end;

 TSwitchDesktopThread = class(TThread)
 private
   FDesk: HDESK;
 protected
   procedure Execute; override;
 public
   constructor Create(ADesk: HDESK);
 end;

var
 Form: TForm;
 Test: TTest;

function GetDesktopName(ADesk: HDESK): string;
var
 lpnLengthNeeded: Cardinal;
 pvInfo: PChar;
begin
 result := '';
 pvInfo := nil;
 GetUserObjectInformation(ADesk, UOI_NAME, pvInfo, 0, lpnLengthNeeded);
 pvInfo := StrAlloc(lpnLengthNeeded);
 try
   if GetUserObjectInformation(ADesk, UOI_NAME, pvInfo, lpnLengthNeeded,
       lpnLengthNeeded) then
     SetString(result, pvInfo, lpnLengthNeeded-1);
 finally
   StrDispose(pvInfo);
 end;
end;

function IsClubDesktop: boolean;
var
 hObj: HDESK;
begin
 hObj := GetThreadDesktop(GetCurrentThreadId);
 result := GetDesktopName(hObj) = C_ClubDesktop;
end;

procedure CreateClubDesktop;
var
 hObj: HDESK;
begin
 hObj := CreateDesktop(C_ClubDesktop, nil, nil, DF_ALLOWOTHERACCOUNTHOOK,
   DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or
   DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_HOOKCONTROL or
   DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_WRITEOBJECTS, nil);
 if hObj = 0 then
   raise Exception.Create(SysErrorMessage(GetLastError));
end;

procedure StartClubShell;
var
 SI: STARTUPINFO;
 PI: TPROCESSINFORMATION;
begin
 FillMemory(@SI, sizeof(SI), 0);
 FillMemory(@PI, sizeof(PI), 0);
 SI.cb := sizeof(SI);
 SI.lpDesktop := PChar('WinSta0\'+C_ClubDesktop);
 if not CreateProcess(PChar(Application.ExeName), nil, nil, nil, false,
     NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE, nil, nil, SI, PI) then
   raise Exception.Create(SysErrorMessage(GetLastError));
end;

function SwitchDesktopExt(ADesk: HDESK): Boolean;
begin
 with TSwitchDesktopThread.Create(ADesk) do
   try
     WaitFor;
     Result := Boolean(ReturnValue);
   finally
     Free;
   end;
end;

procedure ShowClubDesktop;
var
 hObj: HDESK;
begin
 hObj := OpenDesktop(C_ClubDesktop, DF_ALLOWOTHERACCOUNTHOOK, true,
   DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or
   DESKTOP_HOOKCONTROL or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or
   DESKTOP_WRITEOBJECTS);
 SwitchDesktopExt(hObj);
 CloseDesktop(hObj);
end;

procedure ShowDefaultDesktop;
var
 hObj: HDESK;
begin
 hObj := OpenDesktop('Default', DF_ALLOWOTHERACCOUNTHOOK, true,
   DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or
   DESKTOP_HOOKCONTROL or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or
   DESKTOP_WRITEOBJECTS);
 SwitchDesktopExt(hObj);
 CloseDesktop(hObj);
end;

{ TTest }

procedure TTest.Close(Sender: TObject);
begin
 Form.Close;
end;

procedure TTest.Open(Sender: TObject);
begin
 with TOpenDialog.Create(nil) do
   try
     if Execute then
       ShellExecute(Form.Handle,'open',PChar(FileName),nil,nil,SW_SHOW);
   finally
     Free;
   end;
end;

{ TSwitchDesktopThread }

constructor TSwitchDesktopThread.Create(ADesk: HDESK);
begin
 inherited Create(false);
 FDesk := ADesk;
end;

procedure TSwitchDesktopThread.Execute;
begin
 ReturnValue := Integer(false);
 if SetThreadDesktop(FDesk) then
   if SwitchDesktop(FDesk) then
     ReturnValue := Integer(false);
end;

begin
 Application.Initialize;
 if IsClubDesktop then begin
   Application.CreateForm(TForm, Form);
   Test := TTest.Create(Form);
   with TButton.Create(Form) do begin
     Parent:=Form;
     Visible:=true;
     Caption := 'Close';
     SetBounds(10,10,100,20);
     OnClick := Test.Close;
   end;
   with TButton.Create(Form) do begin
     Parent:=Form;
     Visible:=true;
     Caption := 'Open';
     SetBounds(10,40,100,20);
     OnClick := Test.Open;
   end;
   Application.Run;
   Test.Free;
   ShowDefaultDesktop;
 end else begin
   CreateClubDesktop;
   StartClubShell;
   ShowClubDesktop;
 end;
end.


DVM   (2004-06-28 17:37:00) [2]


> Если я выложу твой код, возражений не будет ?

Да ради бога, Игорь. Только там в конце он покоцанный, его чуть подправить надо.

> Тогда впролне логичный вопрос - а другие программы тоже
> будут на прежний декстоп открываться?

Те, что запущены уже на этом новом десктопе на новый. Старые, запущенные ранее, все остануться на старом.


Игорь Шевченко   (2004-06-28 16:26:00) [3]

DVM ©   (28.06.04 15:04)

Если я выложу твой код, возражений не будет ?


DrPass   (2004-06-28 15:54:00) [4]


> Таскменеджер же будет открываться, но он будет открываться
> на прежний дефолтовый десктоп и будет создаваться иллюзия,
> что Ctrl+Alt+Del не работают

Тогда впролне логичный вопрос - а другие программы тоже будут на прежний декстоп открываться?


DVM   (2004-06-28 15:04:00) [5]


> m2003 ©  


> Например в Windows 2000 можно из TaskManager запустить программу
> - это не приемлемо.

Так подправь таскменеджер. Возьми Restorator и удали у него там кнопку "Новая задача" и меню. И в Safe Mode положи подправленный вариант его на место исходного.
Это легче, чем разбираться с Десктопами.
То же надо сделать с остальными "дырявыми программами".

Что до десктопов, то надо создать свой десктоп и переключиться на него. Там на этом десктопе не будет ничего, кроме окна твоей программы. Таскменеджер же будет открываться, но он будет открываться на прежний дефолтовый десктоп и будет создаваться иллюзия, что Ctrl+Alt+Del не работают.
Кода у меня сейчас нет, найду потом напишу - длинный он.


m2003   (2004-06-28 08:19:00) [6]

2 Игорь Шевченко:
Дайте нам посмотреть.


Игорь Шевченко   (2004-06-27 23:02:00) [7]

DrPass ©   (27.06.04 15:11)


> От TaskManager это не спасет


Я тоже заблуждался. DVM (с) прислал программу с примером того, что спасет.


m2003   (2004-06-27 22:44:00) [8]

Что делать будем?


Cardinal   (2004-06-27 18:10:00) [9]

По-моему все "затыкнуть" нельзя: все-равно найдется лазейка.
Пример: http://amis.h11.ru/story1.htm


DrPass   (2004-06-27 15:11:00) [10]


> Сделай ее со своим Desktop'ом

От TaskManager это не спасет. А запретить запуск тех или иных программ можно в политиках безопасности ("Управление компьютером" в папке "Администрирование")


m2003   (2004-06-27 08:36:00) [11]

я хотел сказать что все действия будут выполнятся через неё и ТОЛЬКО через неё. Как это сделать?


Игорь Шевченко   (2004-06-26 18:52:00) [12]


> Хочу сделать программу которая будет запускаться вместо
> Explorer'а и все действия будут выполняться через неё.


Сделай ее со своим Desktop'ом


Alternative   (2004-06-26 17:35:00) [13]

ДиллерХХ, кто такой "Осел"?


DillerXX   (2004-06-26 09:55:00) [14]

В настройках доступа пользователя. Запрети потом все горячие клавиши, и при появлении окна Осла (если вдруг умный чел), прихлопывай тут же его...


m2003   (2004-06-26 08:29:00) [15]

как?


DrPass   (2004-06-26 00:58:00) [16]

Запрети запуск TaskManager


Наверх

Титульная страница Поиск, карта сайта Написать письмо