Always Active: Faking Microsoft Teams Green Status in Go
Go로 Microsoft Teams 초록 상태 유지하기
Go와 Windows API로 마우스·키보드 입력을 흉내 내 Teams 상태를 초록색으로 유지하는 도구를 소개합니다. 댓글에서는 PowerShell 한 줄로도 같은 동작을 구현할 수 있다는 의견과, 절전 방지 API만으로는 Teams 상태가 바뀌지 않는다는 지적이 나옵니다.
- 주제
AI 요약
여러 기기를 쓰면 Teams를 켜 둔 컴퓨터를 직접 조작하지 않아 상태가 ‘자리 비움’으로 바뀌기도 합니다. 글쓴이는 이를 막는 Go 프로그램을 소개합니다. Teams 상태 표시가 실제 업무 성과를 나타내지 않는다는 문제의식에서 출발하지만, 이 프로그램은 사용자의 활동을 가장하는 방식으로 상태 표시를 유지합니다.
Windows 입력 이벤트 흉내 내기
글쓴이는 Teams가 마우스 이동이나 키보드 입력, 컴퓨터의 절전 여부를 살핀다고 설명합니다. Teams는 비공개 소프트웨어라 내부 동작을 직접 확인할 수 없으며, 이 설명은 리버스 엔지니어링과 사용자 보고를 바탕으로 합니다. 글에 따르면 Windows의 GetLastInputInfo() 등으로 입력 시점을 확인할 수 있고, WM_WTSSESSION_CHANGE와 전원 상태 알림도 앱에 전달됩니다.
Go 프로그램은 Teams 자체와 통신하지 않습니다. Windows 시스템 라이브러리인 user32.dll의 GetCursorPos, SetCursorPos, keybd_event를 호출합니다. 커서를 조금 옮기고 Scroll Lock 입력을 두 번 보내 키 상태를 원래대로 돌립니다. 글쓴이는 작성 당시 Scroll Lock 입력만으로도 초록 상태를 유지했다고 전합니다. 커서 이동 코드는 향후 동작을 더 확실히 하려는 용도지만, 실제로 쓰는 컴퓨터에서 커서가 움직이지 않게 하려면 해당 부분을 빼라고 안내합니다.
프로그램은 kernel32.dll의 SetThreadExecutionState도 호출합니다. ES_CONTINUOUS, ES_SYSTEM_REQUIRED, ES_DISPLAY_REQUIRED 플래그를 설정해 시스템과 화면이 유휴 상태로 들어가지 않게 합니다. 글쓴이는 이 설정이 Teams가 사용자가 자리를 비웠다고 판단할 만한 상태를 막는 데 필요하다고 설명합니다. 다만 댓글에서는 Teams의 자리 비움 상태가 Windows 유휴 타이머를 따르므로, 절전 방지 설정만으로는 상태가 바뀌지 않고 입력 이벤트를 보내야 한다고 반박합니다. 두 동작, 즉 시스템 절전 방지와 Teams 상태 변경을 같은 효과로 보면 안 된다는 지적입니다.
빌드와 실행
작성자는 Go 코드를 -H=windowsgui 옵션으로 빌드하면 콘솔 창 없이 실행되는 2.9MB짜리 Windows 11용 실행 파일을 만들 수 있다고 설명합니다. 실행 중 메모리는 약 4MB를 쓴다고 합니다. 관리자 권한은 필요하지 않으며, 작업 관리자나 taskkill /IM mstkeepalive.exe /F 명령으로 종료할 수 있습니다. PowerShell 스크립트보다 덜 눈에 띈다는 점도 장점으로 내세우지만, 댓글에서는 회사 IT 부서가 낯선 실행 파일을 발견할 수 있다는 우려가 나옵니다.
댓글 반응
한 댓글은 이 방법이 실제 불편을 해결한다고 반기지만, 다른 댓글은 PowerShell에서 Scroll Lock을 반복 입력하는 한 줄 스크립트로도 같은 효과를 낸다고 제안합니다. 하드웨어 쪽에서는 4달러짜리 RP2040 보드와 MicroPython으로 마우스 지글러를 만들었다는 사례가 나옵니다. 반대로 키 입력을 가장하면 키로거 감시나 IT 모니터링에 걸릴 수 있다는 우려도 있습니다. Slack에서도 비슷한 방식이 통한다는 경험담과, Slack용 버전을 요청하는 댓글이 이어집니다.
또 다른 댓글은 Windows Teams가 OS 유휴 시간(GetLastInputInfo)을 기준으로 자리 비움을 계산한다며, SetThreadExecutionState는 상태를 바꾸지 않는다고 지적합니다. 이 댓글은 조직에서 허용하고 Presence.ReadWrite 권한을 받을 수 있다면 Microsoft Graph의 setUserPreferredPresence로 선호 상태를 설정하는 방법도 제시합니다. 글의 구현 방식과 별개로, 상태 표시를 성과 지표처럼 쓰는 관행에 대한 불만도 댓글에서 반복됩니다.
Reddit 반응
- @u/_predator_ — 드디어 사람들이 실제로 겪는 문제를 해결하는 방법이 나왔네요.
- @u/Ftbftw — PowerShell로 Scroll Lock을 반복해서 누르게 하세요. 한 줄이면 됩니다. 천만에요.
- @u/Ftbftw —
Add-Type -AssemblyName System.Windows.Forms를 불러온 뒤, 120분 동안 Scroll Lock을 눌렀다 100밀리초 뒤 다시 눌러 원상태로 돌리고, 60초 기다리는 루프를 쓰면 됩니다.
- @u/Ftbftw —
- @u/LePfeiff — 제대로 된 IT 부서라면 직원 한 명의 컴퓨터에서만 실행되는 낯선 바이너리는 알아차리겠지만, Ctrl 키 위에 올려 둔 추는 못 알아차릴 겁니다.
- @u/kintar1900 — 그게 제가 4달러짜리 RP2040 개발 보드와 100줄도 안 되는 MicroPython으로 하드웨어 마우스 지글러를 만든 이유 중 하나입니다. 보너스로 컴퓨터를 직접 쓸 때 실행을 멈추는 토글 스위치도 달았습니다.
- @u/RegularTrashman — 출력 내용을 읽는 로컬 LLM이 달린 키로거라면 알아차리겠네요. 이런 게 흔해지기까지 얼마나 걸릴까요?
- @u/Mo_Dice — LLM도 필요 없습니다. 2~3주 전에 다른 기술 커뮤니티에서 비슷한 이야기를 읽었습니다. 키보드 위에 책을 올려뒀다가 들킨 사람이었는데, 댓글 대부분은 백그라운드 키로거 대시보드가 해당 컴퓨터에서 이상 징후를 쏟아내 누군가 확인하러 갔을 거라는 내용이었습니다.
- @u/fasmat — 이제 Mac과 Linux 버전도 만들어 주세요.
- @u/just-some-douchebag — Mac에서는
go-vgo/robotgo를 써서 어느 정도 잘 작동했습니다. - @u/LowReputation — 일하는 척하려고 Windows를 써야 한다면 차라리 그냥 일하겠습니다.
- @u/just-some-douchebag — Mac에서는
- @u/UpcomingDude1 — Slack 버전도 만들어 주세요.
- @u/MassiveHyperion — Slack도 Windows에서 Teams와 같은 방식으로 활동을 감지한다면 작동할 겁니다.
- @u/just-some-douchebag — 참고로
go-vgo/robotgo로 마우스를 움직이는 프로그램을 직접 만들었는데 Slack이 계속 활성 상태로 남습니다. - @u/dirtyklean — 프로세스가 감지되지 않도록 업무용 컴퓨터가 아닌 다른 기기에서 실행하나요? 그래도 활성 상태는 초록색으로 유지될 것 같네요.
- @u/just-some-douchebag — 제 프로그램은 기본적인 방식으로 컴퓨터가 깨어 있게만 합니다. 활성 상태를 유지할 컴퓨터에서 터미널로 실행합니다. Slack을 다른 모니터에 띄워 두면 마우스 움직임으로 잘 유지됩니다. IT 도구가 감지하는 문제는 실제로 생기면 그때 처리하겠습니다.
- @u/GoBoltsTBL — 몇 년 전에 마우스 지글러로 이미 해결했습니다.
- @u/Open-Adhesiveness-86 — Windows Teams는 OS 유휴 타이머(
GetLastInputInfo)에서 자리 비움 상태를 가져옵니다. 입력을 주입하지 않으면 상태가 바뀌지 않으며SetThreadExecutionState는 아무 효과가 없습니다. 더 조용한 방법은 조직에서 허용할 경우Presence.ReadWrite권한을 받아/me/presence의setUserPreferredPresence로 만료 시간까지 사용 가능 상태를 설정하는 것입니다. 로컬 바이너리로 입력을 흉내 낼 필요가 없습니다.
원문: Medium / 번역·요약: Trawling