Как-то "Козявочка" выразила беспокойство по поводу того, что у нас на работе могут отслеживать присутствие сотрудника на рабочем месте и его активность в течении рабочего дня. А так-как она числится "за штатом", распорядок её рабочего дня сильно зависит от случая.

Сейчас у нас даже отправляются системные журналы 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
    }
}