Программная блокировка винды (виста и старше)
Кто-нибудь знает, как можно организовать сабж? Т.е. как не пускать юзера в систему я знаю - перекрыть стандартный Credential Provider. А вот как залочить комп, если юзер уже залогинился?пишешь скрипт. Первым действием блокируешь пользователя. Вторым действием убиваешь текущую сессию пользователя. Запускаешь скрипт через ssh и радуешься. Я так делал на winXP. Возможно те же самые консольные команды сохранились и для висты.
А что именно делал скрипт? К каким вызовам WinAPI это сводится?
net user - это для блокирования пользователя
taskkill - для убийства сессии
Вот этими радостями я пользовался. Через какой API вызов они работают я не задумывался
rundll32.exe user32.dll, LockWorkStation
а есть то же самое, но с перламутровыми чтобы можно было из сервиса вызвать?..rundll просто вызывает экспортированную функцию из указанной dll-ки по имени
залинкуйся с user32.dll, да вызови.
Я уже почитал на MSDN:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa37...
функция работает только при вызове из процесса интерактивной сессии
функция работает только при вызове из процесса интерактивной сессииЕсть ещё WTSDisconnectSession для блокировки сессии по её номеру и WTSLogoffSession для её завершения.
а это только для сессий Remote Desktop работает, или для обычных тоже?
Я уже почитал на MSDN:где-то там же написано, как вызывать функции из под юзерской сессии
а это только для сессий Remote Desktop работает, или для обычных тоже?Для обычных тоже.
#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);
}
Оставить комментарий
freezer
Кто-нибудь знает, как можно организовать сабж? Т.е. как не пускать юзера в систему я знаю - перекрыть стандартный Credential Provider. А вот как залочить комп, если юзер уже залогинился?