Эмуляция активности пользователя на рабочем месте с помощью powershell
09 Dec 2016Как-то "Козявочка" выразила беспокойство по поводу того, что у нас на работе могут отслеживать присутствие сотрудника на рабочем месте и его активность в течении рабочего дня. А так-как она числится "за штатом", распорядок её рабочего дня сильно зависит от случая.
Сейчас у нас даже отправляются системные журналы Windows всех рабочих станций сборщику логов, по которым автоматические формируются табели учета рабочего времени (конечно в случае отклонений проводятся ручные уточнения). Наверное, никто не анализирует саму активность в течение рабочего дня, а только проверяется время включения/выключения компьютера, но Lync политиками настроен на автоматическую установку статуса - "Нет на месте" через 10-15 минут бездействия. Соответственно это могут видеть твои руководители. Я озадачился данным вопросом, итогом был скрипт на powershell. Запуск не подписанных скриптов простым смертным у нас запрещен, но это можно обойти, просто скопировав текст скрипта в окно powershell. Скрипт устанавливает курсор в случайную точку и нажимает ПКМ каждые 50 секунд, в принципе этого достаточно, чтобы Lync думал, что ты на месте.
Совет дня. Уважаемые работодатели, как бы вы не контролировали своих сотрудников, недобросовестные из них найдут 1001 способ обмануть вас, а добросовестные сделают свою работу без какого-либо контроля с вашей стороны. Нет смысла в тотальном контроле.
Текст скрипта:
#[CmdletBinding()]
#param($Interval = 50000, [switch]$RightClick, [switch]$NoMove)
#Для запуска скрипта с параметрами раскоментировать верние две строки и закоментировать три нижних
$Interval = 50000
$RightClick = $true
$NoMove = $false
#Узнаем разрешение монитора
$screenSize = Get-WmiObject -Class Win32_DesktopMonitor | Select-Object ScreenWidth,ScreenHeight
[Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
$DebugViewWindow_TypeDef = @'
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string ClassName, string Title);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern bool SetCursorPos(int X, int Y);
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out System.Drawing.Point pt);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
public static void LeftClick(){
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}
public static void RightClick(){
mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
}
'@
Add-Type -MemberDefinition $DebugViewWindow_TypeDef -Namespace AutoClicker -Name Temp -ReferencedAssemblies System.Drawing
$pt = New-Object System.Drawing.Point
if ([AutoClicker.Temp]::GetCursorPos([ref]$pt)) {
Write-host "Нажимаем ПКМ в точке $($pt.X), $($pt.Y) каждые ${Interval}мс, пока не нажмут Ctrl^C или не нажмут кнопку " -NoNewline
Write-Host -ForegroundColor Cyan "Пуск " -NoNewline
Write-Host "(не работает в Windows 7)."
while($true) {
$start = [AutoClicker.Temp]::FindWindow("ImmersiveLauncher", "Start menu")
$fg = [AutoClicker.Temp]::GetForegroundWindow()
if ($start -eq $fg) {
Write-Host "Нажали Пуск. Завершаем работу скрипта"
return
}
if (!$NoMove) {
#Устанавливаем курсор в случайную точку экрана
$curPosX = Get-Random -Maximum $screenSize.ScreenWidth -Minimum 1
$curPosY = Get-Random -Maximum $screenSize.ScreenHeight -Minimum 1
[AutoClicker.Temp]::SetCursorPos($curPosX, $curPosY) | Out-Null
}
if ($RightClick) {
[AutoClicker.Temp]::RightClick()
} else {
[AutoClicker.Temp]::LeftClick()
}
sleep -Milliseconds $Interval
}
}