Что нового

BlockInput без прав администратора

vovsla

Осваивающий
Сообщения
605
Репутация
35
Подскажите пожалуйста, как можно заблокировать любой ввод без прав администратора?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,722
Нажать Power Off на системном блоке. :smile:
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Можно забирать клавиатуру, мышку - а когда нужно - звать администратора.
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
alex33 сказал(а):

Спасибо, штука полезная, но в данном случае не помогла.
Если совсем без прав администратора никак, то можно рассмотреть другой вариант
Программа запускается из под учетки без прав администратора, но с помощью RunAs в которой будут прописаны данные админской учетки.
Только почему-то нет блокировки при всех вариантах запуска которые указаны ниже
Код:
#include <Process.au3>

RunAs('Username', @ComputerName, 'Password', 0, 'cmd /c start '&@ScriptDir&'\Block.exe', '', @SW_HIDE)

RunAs('Username', @ComputerName, 'Password', 1, 'cmd /c start '&@ScriptDir&'\Block.exe', '', @SW_HIDE)

RunAs('Username', @ComputerName, 'Password', 0, @ScriptDir&'\Block.exe', '', @SW_HIDE)

RunAs('Username', @ComputerName, 'Password', 1, @ScriptDir&'\Block.exe', '', @SW_HIDE)

_RunDos('/noprofiles /user:'&@ComputerName&'\Username '&@ScriptDir&'\Block.exe')
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,670
Репутация
2,473
Vovsla [?]
Если совсем без прав администратора никак, то можно рассмотреть другой вариант
Тогда можно просто использовать директиву
Код:
#RequireAdmin
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
Можно, но потребуются действия пользователя. А в данном случае все должно работать автоматически.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Vovsla сказал(а):
Можно, но потребуются действия пользователя. А в данном случае все должно работать автоматически.
Не легче вообще его отключить, поставить на 0?
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
Нет, ситуация следующая. Win загружается с учетной записью пользователя у которого ограничены права, но при загрузке Win необходимо автоматически запустить программу у которой не будет ограничений которые есть у пользователя


Добавлено:
Сообщение автоматически объединено:

Может сделать сервис? Или может загружать Win с правами администратора, запускать программу, а потом менять пользователя... Нужно погуглить как автоматически сменить пользователя...
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
Vovsla
Попробуйте использовать планировщик заданий
http://www.fadmin.ru/vopros/kak-sdelat-avtozapusk-programmy-s-pravami-administratora-pod-polzovatelem-bez-vvoda-parolya-v
http://it-handbook.ru/windows/nastrojka-avtozapuska-programm-s-pravami-administratora-v-windows-7.html
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
Пробовал, не блокирует, прав не хватает. Причем пробовал через планировщик запускать еще и программу которая запускает программу блокировки от другого пользователя (админа), и никак...
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
Нашел программу Child Lock, блокирует устройства ввода, для запуска не нужны права администратора.
http://optimakomp.ru/child-lock-vyklyuchatel-klaviatury-i-kompyuternojj-myshi/

Только там другой принцип блокирования, ПК реагирует на ввод, но меняется курсор мыши и ничего ввести нельзя
Как можно реализовать аналогичный функционал на автоите?
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
Нашел блокировку на дельфи, реализована через хуки. Как это можно реализовать на автоите?
Исходник dll LowLevelMouseHook.dll
Код:
library LowLevelMouseHook;

uses
  Windows,
  Messages;

const
  WH_MOUSE_LL = 14;
  MMFName: PChar = 'MMF';

type
  PGlobalDLLData = ^TGlobalDLLData;
  TGlobalDLLData = packed record
    WndHook: HWND;
    Wnd: HWND;
  end;

type
 TMouseHookFilters = record
   BlockMouseMove: boolean;
   BlockLeftButton: boolean;
   BlockRightButton: boolean;
   BlockMiddleButton: boolean;
   BlockWheel: boolean;
   end;

var
  GlobalData: PGlobalDLLData;
  MMFHandle: THandle;
  Filters: TMouseHookFilters;
  MWM_LBUTTONDOWN: Cardinal;
  MWM_LBUTTONUP: Cardinal;
  MWM_MBUTTONDOWN: Cardinal;
  MWM_MBUTTONUP: Cardinal;
  MWM_RBUTTONDOWN: Cardinal;
  MWM_RBUTTONUP: Cardinal;
  MWM_MOUSEWHEEL: Cardinal;
  MWM_MOUSEMOVE: Cardinal;

function LowLevelMouseProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
begin
  if (Code = HC_ACTION) then
  begin
    if (wParam =  WM_LBUTTONDOWN) then
    begin
      SendMessage(GlobalData.Wnd, MWM_LBUTTONDOWN, 0, 0);
      if Filters.BlockLeftButton = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_LBUTTONUP) then
    begin
      SendMessage(GlobalData.Wnd, MWM_LBUTTONUP, 0, 0);
      if Filters.BlockLeftButton = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MBUTTONDOWN) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MBUTTONDOWN, 0, 0);
      if Filters.BlockMiddleButton = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MBUTTONUP) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MBUTTONUP, 0, 0);
      if Filters.BlockMiddleButton = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_RBUTTONDOWN) then
    begin
      SendMessage(GlobalData.Wnd, MWM_RBUTTONDOWN, 0, 0);
      if Filters.BlockRightButton = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_RBUTTONUP) then
    begin
      SendMessage(GlobalData.Wnd, MWM_RBUTTONUP, 0, 0);
      if Filters.BlockRightButton = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MOUSEWHEEL) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MOUSEWHEEL, 0, 0);
      if Filters.BlockWheel = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end else
    if (wParam =  WM_MOUSEMOVE) then
    begin
      SendMessage(GlobalData.Wnd, MWM_MOUSEMOVE, 0, 0);
      if Filters.BlockMouseMove = True then
        Result := - 1
      else
        Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
    end
    else
      Result := CallNextHookEx(GlobalData^.WndHook, Code, wParam, lParam);
  end;
end;

function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; export; stdcall;
begin
  Result := False;
  if State = True then
  begin
    GlobalData^.WndHook := SetWindowsHookEx(WH_MOUSE_LL, @LowLevelMouseProc, hInstance, 0);
    GlobalData^.Wnd := Wnd;
    if GlobalData^.WndHook <> 0 then
      Result := True;
  end
  else
  begin
    UnhookWindowsHookEx(GlobalData^.WndHook);
    Result := False;
  end;
end;

function StopMouseHook(): Boolean; export; stdcall;
begin
  UnhookWindowsHookEx(GlobalData^.WndHook);
  if GlobalData^.WndHook = 0 then
    Result := False
  else
   Result := True;
end;

function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; export; stdcall;
begin
  Filters := HookFilters;
end;

procedure OpenGlobalData();
begin
  MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
  MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
  MWM_MBUTTONDOWN := RegisterWindowMessage('MWM_MBUTTONDOWN');
  MWM_MBUTTONUP := RegisterWindowMessage('MWM_MBUTTONUP');
  MWM_RBUTTONDOWN := RegisterWindowMessage('MWM_RBUTTONDOWN');
  MWM_RBUTTONUP := RegisterWindowMessage('MWM_RBUTTONUP');
  MWM_MOUSEWHEEL := RegisterWindowMessage('MWM_MOUSEWHEEL');
  MWM_MOUSEMOVE := RegisterWindowMessage('MWM_MOUSEMOVE');
  MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
  GlobalData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
  if GlobalData = nil then
    CloseHandle(MMFHandle);
end;

procedure CloseGlobalData();
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MMFHandle);
end;

procedure DLLEntryPoint(Reason: DWORD);
begin
  case Reason of
    DLL_PROCESS_ATTACH: OpenGlobalData;
    DLL_PROCESS_DETACH: CloseGlobalData;
  end;
end;

exports StartMouseHook, StopMouseHook, UpdateMouseHook;

begin
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


исходник на дельфи
Код:
{Автор Зорков Игорь - [email protected]
Спасибо Мастерам Delphi за их сайт - http://www.delphimaster.ru,
Пожалуй лучший (на мой взгляд) сайт на английском языке посвящённый Delphi - http://www.torry.net,
Все исходники Delphi здесь - http://www.delphisources.ru/index.html}
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    gbHookStatus: TGroupBox;
    btnStopHook: TButton;
    btnStartHook: TButton;
    btnUpdateHook: TButton;
    gbFilterOptions: TGroupBox;
    cbBlockLeftButton: TCheckBox;
    cbBlockMiddleButton: TCheckBox;
    cbBlockRightButton: TCheckBox;
    cbBlockMouseMove: TCheckBox;
    cbBlockWheel: TCheckBox;
    gbStayOnTop: TGroupBox;
    cbStayOnTop: TCheckBox;
    cbLeftMouseClick: TCheckBox;
    cbMiddleMouseClick: TCheckBox;
    cbRightMouseClick: TCheckBox;
    procedure btnStartHookClick(Sender: TObject);
    procedure btnUpdateHookClick(Sender: TObject);
    procedure btnStopHookClick(Sender: TObject);
    procedure cbStayOnTopClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  protected
    procedure WndProc(var Msg: TMessage); override;
  private
    { Private declarations }
  public
    { Public declarations }
    procedure UpdateHook();
  end;

type
 TMouseHookFilters = record
   BlockMouseMove: boolean;
   BlockLeftButton: boolean;
   BlockRightButton: boolean;
   BlockMiddleButton: boolean;
   BlockWheel: boolean;
 end;

var
  Form1: TForm1;
  HookEnable: Boolean = False;
  HookFilters: TMouseHookFilters;
  MWM_LBUTTONDOWN: Cardinal;
  MWM_LBUTTONUP: Cardinal;
  MWM_MBUTTONDOWN: Cardinal;
  MWM_MBUTTONUP: Cardinal;
  MWM_RBUTTONDOWN: Cardinal;
  MWM_RBUTTONUP: Cardinal;
  MWM_MOUSEWHEEL: Cardinal;
  MWM_MOUSEMOVE: Cardinal;


  {Если в папке отсутствует LowLevelMouseHook.dll откройте и скомпилируйте проект LowLevelMouseHook
  (File->Open Project...->LowLevelMouseHook.dpr)
  Project->Compile LowLevelMouseHook}
  function StartMouseHook(State: Boolean; Wnd: HWND): Boolean; stdcall; external 'LowLevelMouseHook.dll';
  function StopMouseHook(): Boolean; stdcall; external 'LowLevelMouseHook.dll';
  function UpdateMouseHook(HookFilters: TMouseHookFilters): Boolean; stdcall; external 'LowLevelMouseHook.dll';

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;
  if (Msg.Msg = MWM_LBUTTONDOWN) then
  begin
    cbLeftMouseClick.Checked := true
  end;
  if (Msg.Msg = MWM_LBUTTONUP) then
  begin
    cbLeftMouseClick.Checked := false;
  end;
  if (Msg.Msg = MWM_MBUTTONDOWN) then
  begin
    cbMiddleMouseClick.Checked := true
  end;
  if (Msg.Msg = MWM_MBUTTONUP) then
  begin
    cbMiddleMouseClick.Checked := false;
  end;
  if (Msg.Msg = MWM_RBUTTONDOWN) then
  begin
    cbRightMouseClick.Checked := true
  end;
  if (Msg.Msg = MWM_RBUTTONUP) then
  begin
    cbRightMouseClick.Checked := false;
  end;
end;

procedure TForm1.UpdateHook();
begin
  if cbBlockLeftButton.Checked then
    HookFilters.BlockLeftButton := True
  else
    HookFilters.BlockLeftButton := False;
  if cbBlockMiddleButton.Checked then
    HookFilters.BlockMiddleButton := True
  else
    HookFilters.BlockMiddleButton := False;
  if cbBlockRightButton.Checked then
    HookFilters.BlockRightButton := True
  else
    HookFilters.BlockRightButton := False;
  if cbBlockWheel.Checked then
    HookFilters.BlockWheel := True
  else
    HookFilters.BlockWheel := False;
  if cbBlockMouseMove.Checked then
    HookFilters.BlockMouseMove := True
  else
    HookFilters.BlockMouseMove := False;
  UpdateMouseHook(HookFilters);
end;

procedure TForm1.btnStartHookClick(Sender: TObject);
begin
  if StartMouseHook(True, Handle) = True then
  begin
    HookEnable := True;
    btnStartHook.Enabled := False;
    btnStopHook.Enabled := True;
    btnUpdateHook.Enabled := True;
    UpdateHook();
  end else
  //
end;

procedure TForm1.btnStopHookClick(Sender: TObject);
begin
  if StopMouseHook = True then
  begin
    HookEnable := False;
    btnStopHook.Enabled := False;
    btnUpdateHook.Enabled := False;
    btnStartHook.Enabled := True;
  end else
  //
end;

procedure TForm1.btnUpdateHookClick(Sender: TObject);
begin
  UpdateHook();
end;

procedure TForm1.cbStayOnTopClick(Sender: TObject);
begin
  if cbStayOnTop.Checked then
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)
  else
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if HookEnable <> False then
    StopMouseHook;
end;

initialization
  MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
  MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
  MWM_MBUTTONDOWN := RegisterWindowMessage('MWM_MBUTTONDOWN');
  MWM_MBUTTONUP := RegisterWindowMessage('MWM_MBUTTONUP');
  MWM_RBUTTONDOWN := RegisterWindowMessage('MWM_RBUTTONDOWN');
  MWM_RBUTTONUP := RegisterWindowMessage('MWM_RBUTTONUP');
  MWM_MOUSEWHEEL := RegisterWindowMessage('MWM_MOUSEWHEEL');
  MWM_MOUSEMOVE := RegisterWindowMessage('MWM_MOUSEMOVE');
end.
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
Vovsla
реализована через хуки. Как это можно реализовать на AutoIt'е?
MouseOnEvent - Обработка событии мышки


Добавлено:
Сообщение автоматически объединено:

Vovsla
Спасибо, штука полезная, но в данном случае не помогла.
Эта "штука", как вы выразились, блокирует работу клавиатуры для окон с такими же правами и ниже. Если скрипт запустить с правами администратора, то будет блокировка всех окон. Если с правами пользователя, то блокируется ввод для всех окон, кроме запущенных с правами администратора. Следовательно, данной UDF достаточно для блокировки пользовательского ввода, т.к. запустить программу от имени администратора он всё равно не сможет.
 

Prog

Продвинутый
Сообщения
484
Репутация
57
Vovsla [?]
Как это можно реализовать на AutoIt
Для этого нужна возможность создавать DLL...
LowLevel Hook заключается в том что DLL подгружается во все процессы...
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
Prog
LowLevel Hook заключается в том что DLL подгружается во все процессы...
И MouseOnEvent и BlockInputEx используют LL-хуки и нормально работают без всяких DLL.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
207
Prog [?]
LowLevel Hook заключается в том что DLL подгружается во все процессы...
Все никак понять не могу, с чего у вас такая лютая любовь к dll? Что ни пост - то нужна dll. Так дойдем и до арифметических операций через dll.

Для реализации LL хуков в другие процессы лезть совсем не нужно, ибо эти хуки, выражаясь предельно просто, распространяются на всю сессию.

Vovsla
http://autoit-script.ru/index.php?topic=20850.msg123312#msg123312

Гляньте тут, элементарный пример использование LL-хука, также рекомендую изучить справку к используемым там функциям.
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
InnI, спасибо, "MouseOnEvent - Обработка событии мышки" работает как нужно.
Только есть проблемы с работой самой библиотеки - если во время блокировки мыши активно ей пользоваться, то потом мышь сильно тормозит.
По этому поводу я отписался в ветке MouseOnEvent

Есть аналогичная библиотека для клавиатуры?
 

InnI

AutoIT Гуру
Сообщения
4,784
Репутация
1,377
Vovsla
аналогичная библиотека для клавиатуры
Вам же давали ссылку на BlockInputEx. Там и для клавиатуры и для мыши - два в одном.
Вот простой пример блокировки ввода с клавиатуры (на 5 секунд)
Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

OnAutoItExitRegister("OnClose")

$hStub_KeyProc = DllCallbackRegister("KeyProc", "long", "int;wparam;lparam")
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), _WinAPI_GetModuleHandle(0))

Sleep(5000)

Func KeyProc($nCode, $wParam, $lParam)
  Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
  If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
  If $wParam = $WM_KEYDOWN Then Return 1
  Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func OnClose()
  _WinAPI_UnhookWindowsHookEx($hHook)
  DllCallbackFree($hStub_KeyProc)
EndFunc
 
Автор
V

vovsla

Осваивающий
Сообщения
605
Репутация
35
В таком виде работает, а я его использовал как _BlockInputEx(1) :smile:
 
Верх