Программная блокировка винды (виста и старше)

freezer

Кто-нибудь знает, как можно организовать сабж? Т.е. как не пускать юзера в систему я знаю - перекрыть стандартный Credential Provider. А вот как залочить комп, если юзер уже залогинился?

yroslavasako

Кто-нибудь знает, как можно организовать сабж? Т.е. как не пускать юзера в систему я знаю - перекрыть стандартный Credential Provider. А вот как залочить комп, если юзер уже залогинился?
пишешь скрипт. Первым действием блокируешь пользователя. Вторым действием убиваешь текущую сессию пользователя. Запускаешь скрипт через ssh и радуешься. Я так делал на winXP. Возможно те же самые консольные команды сохранились и для висты.

freezer

на XP эту штуку можно сделать через GINA - там всё довольно просто.
А что именно делал скрипт? К каким вызовам WinAPI это сводится?

yroslavasako

Я вспомнил названия.
net user - это для блокирования пользователя
taskkill - для убийства сессии
Вот этими радостями я пользовался. Через какой API вызов они работают я не задумывался

viktor954

Что значит "залочить"? Эмуляция стандартного поведения Win+L?

rundll32.exe user32.dll, LockWorkStation

freezer

а есть то же самое, но с перламутровыми чтобы можно было из сервиса вызвать?..

Dasar

а есть то же самое, но с перламутровыми чтобы можно было из сервиса вызвать?..
rundll просто вызывает экспортированную функцию из указанной dll-ки по имени
залинкуйся с user32.dll, да вызови.

freezer

Спасибо, кэп :D
Я уже почитал на MSDN:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa37...
функция работает только при вызове из процесса интерактивной сессии

dazzler

функция работает только при вызове из процесса интерактивной сессии
Есть ещё WTSDisconnectSession для блокировки сессии по её номеру и WTSLogoffSession для её завершения.

freezer

а это только для сессий Remote Desktop работает, или для обычных тоже?

Dasar

Я уже почитал на MSDN:
где-то там же написано, как вызывать функции из под юзерской сессии

dazzler

а это только для сессий Remote Desktop работает, или для обычных тоже?
Для обычных тоже.

freezer

Проверил - фурыкает:

#include <Windows.h>
#include <Wtsapi32.h>

static BOOL IsAdminToken(HANDLE hToken)
{
BYTE adminSid[SECURITY_MAX_SID_SIZE];
DWORD adminSidSize = sizeof(adminSid);

CreateWellKnownSid(WinBuiltinAdministratorsSid, 0, adminSid, &adminSidSize);
PTOKEN_GROUPS pGroupInfo;
DWORD size = 0;
GetTokenInformation(hToken, TokenGroups, NULL, size, &size);
pGroupInfo = (PTOKEN_GROUPS)GlobalAlloc(GPTR, size);
GetTokenInformation(hToken, TokenGroups, pGroupInfo, size, &size);

BOOL isAdmin = FALSE;
for (DWORD i = 0; i<pGroupInfo->GroupCount; i++)
if (EqualSid(adminSid, pGroupInfo->Groups[i].Sid
{
if (pGroupInfo->Groups[i].Attributes & (SE_GROUP_ENABLED | SE_GROUP_USE_FOR_DENY_ONLY
isAdmin = TRUE;
}

GlobalFree(pGroupInfo);
return isAdmin;
}

void LockSimpleUsers
{
HANDLE hServ = WTSOpenServer(NULL);
PWTS_SESSION_INFO info;
DWORD count;
BOOL res = WTSEnumerateSessions(hServ, 0, 1, &info, &count);
if (res)
{
for (DWORD i = 0; i < count; ++i)
if (info[i].State == WTSActive)
{
HANDLE hToken;
res = WTSQueryUserToken(info[i].SessionId, &hToken);
if (!res || !IsAdminToken(hToken
WTSDisconnectSession(hServ, info[i].SessionId, FALSE);
}

WTSFreeMemory(info);
}
WTSCloseServer(hServ);
}
Оставить комментарий
Имя или ник:
Комментарий: