Дуже швидке переключення користувачів Windows. Швидке перемикання користувачів в Windows XP Windows 7 швидке переключення користувачів

Гугленіе видало:

  • Для перемикання сесій використовуйте функції wtsapi32.dll: WTSEnumerateSessions, WTSConnectSession, WTSDisconnectSession (Зараз, коли дивлюся опис цих функцій, воно говорить що працює з віддаленими робочими сесіями, і чесно-кажучи, я в невеликому здивуванні, але у мене працює локально, бездоганно) .
  • Для хоткеев, використовуйте функції user32.dll: RegisterHotKey, UnregisterHotKey. Тут все просто.
Відразу обмовлюся, і можете кидати в мене помідорами, але писав я цю справу на c #, хоча на плюсах, було б звичайно краще, нативної і ін, ін, ін ... Але, тоді я тільки почав освоювати c # і потрібен був досвід, а коли рішення було написано, переписувати його не було необхідності, хоча перенесення його не займе більше одного вечора.

Отже, для початку було написано просте win32 додаток з кнопочкою, після натискання якої виконувався приблизно такий код:
private void SwitchUser () (IntPtr buffer \u003d IntPtr.Zero; int count \u003d 0; // отримуємо список сесій, в яких виконаний вхід if (WTSEnumerateSessions (WTS_CURRENT_SERVER_HANDLE, 0, 1, ref buffer, ref count)) (WTS_SESSION_INFO sessionInfo \u003d new WTS_SESSION_INFO; // найскладніша частина: // акуратно перетворити некеровану пам'ять в керовану for (int index \u003d 0; index< count; index++) sessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure((IntPtr)((int)buffer + (Marshal.SizeOf(new WTS_SESSION_INFO()) * index)), typeof(WTS_SESSION_INFO)); int activeSessId = -1; int targetSessId = -1; // получаем Id активного, и неактивного сеанса // 0 пропускаем, там всегда "Services" for (int i = 1; i < count; i++) { if (sessionInfo[i].State == WTS_CONNECTSTATE_CLASS.WTSDisconnected) targetSessId = sessionInfo[i].SessionId; else if (sessionInfo[i].State == WTS_CONNECTSTATE_CLASS.WTSActive) activeSessId = sessionInfo[i].SessionId; } if ((activeSessId > 0) && (targetSessId\u003e 0)) (// якщо є неактивний сеанс, то перемикається на нього. WTSConnectSession (Convert.ToUInt64 (targetSessId), Convert.ToUInt64 (activeSessId), "", false);) else (// якщо неактивних немає. просто відключаємося (переходимо на екран вибору користувача) WTSDisconnectSession (WTS_CURRENT_SERVER_HANDLE, activeSessId, false);)) // обов'язково чистимо пам'ять WTSFreeMemory (buffer); )
При двох сеансах sessionInfo матиме 3 елементи: сеанс служб, сеанс 1-го користувача, сеанс 2-го користувача. Відповідно targetSessId і activeSessId визначаться однозначно. При сеансах більше 2, перемикання буде відбуватися між активним і останнім неактивним.

Але тут мене спіткала невелика невдача. Деякі вже могли здогадатися, що так справа не піде. У момент виконання WTSConnectSession з програми, відключення активного користувача відбувається, а ось включення другого користувача - немає. Тобто простіше кажучи, додаток одного користувача не може ініціювати вхід іншого користувача. Але це може зробити служба! Так, дуже шкода, але без системної служби у нас нічого не вийде. Добре, створимо системну службу в яку закинемо цей код. Ось тут-то і стане в нагоді C # і.Net, так як написати службу на цих технологіях дуже і дуже просто. Тепер виникає наступна проблема: служба не має призначеного для користувача інтерфейсу, тобто користувач не може безпосередньо вплинути на роботу служби, а служба не може почути дії користувача. Навісити хоткей на службу не можна.

Отже, ось наше рішення:
Користувача додаток слухає користувача, і при виявленні хоткея, посилає сигнал системної службі, яка і виконує перемикання.

Залишилося зовсім небагато, але і тут мені знайдеться що вам показати. Наприклад те, що нам потрібно десктопних програм, без вікон, але щоб воно приймало хоткеі. Це можна зробити так, як роблять усі: Приховати головне вікно програми, але не показувати. Але є рішення краще. Написати свій ApplicationContext. З блек
Наприклад такий:
internal class SUApplicationContext: ApplicationContext (private Hotkey hk; private Form form; private const int SWITCH_USER_COMMAND \u003d 193; internal SUApplicationContext () (// тільки створюємо форму, вона все одно потрібна // щоб слухати хоткеі form \u003d new Form (); // створюємо глобальний хоткей Win + A hk \u003d new Hotkey (Keys.A, false, false, false, true); // делегуємо обробник події hk.Pressed + \u003d delegate (SendSwitchCommand ();); // реєструємо хоткей, якщо можемо if (hk.GetCanRegister (form)) hk.Register (form); // Вішаємо подія на вихід Application.ApplicationExit + \u003d Application_ApplicationExit;) private void SendSwitchCommand () (// Описуємо нашу службу ServiceController sc \u003d new ServiceController ( "Sus") ; try (// посилаємо їй команду sc.ExecuteCommand (SWITCH_USER_COMMAND);) catch (Exception ex) (MessageBox.Show (ex.Message);)) void Application_ApplicationExit (object sender, EventArgs e) (// при виході разрегістріруем хоткей if (hk.Registered) hk.Unregister (); )) Static void Main () (Application.EnableVisualStyles (); Application.SetCompatibleTextRenderingDefault (false); Application.Run (new SUApplicationContext ());)
Тут я використовую знайдений на просторах інтернету інтерфейс MovablePython.Hotkey над user32.dll функціями RegisterHotKey, UnregisterHotKey.

І пару рядків про саму службу.
protected override void OnCustomCommand (int command) (base.OnCustomCommand (command); if (command \u003d\u003d SWITCH_USER_COMMAND) (SwitchUser ();))
Переобумовленої подія OnCustomCommand, і при отриманні нашої команди, виконуємо вже відому нам функцію.

Залишилося зареєструвати і запустити службу, і поставити в автозавантаження кожному користувачеві додаток.

Усе. Тепер після того, як увійшов перший користувач після запуску комп'ютера і натиснув Win + A, його сеанс відключається, і з'являється вікно вибору користувача. Входить другий користувач, натискає Win + A - з'являється сеанс першого користувача. І т.д.

На github ви можете ознайомитися з кодами. Або можете завантажити весь проект і скомпільовані і готові до роботи виконувані файли.

Якщо ПК користуєтеся не тільки ви, але і інші люди, то для кожного з них можна зробити власний обліковий запис. Ви можете налаштувати «учетку» так, як вам зручно: змінити заставку Робочого столу, зовнішній вигляд папок, Панель завдань, встановити необхідні саме вам програми і багато іншого.

Для будь-якого користувача створюється обліковий запис з правами "Адміністратора» або «Гостя». У першому випадку у людини буде більше можливостей. Він зможе відкривати деякі програми, які будуть недоступні іншим «юзерам», додавати і видаляти облікові записи.

Коли на комп'ютері встановлена \u200b\u200b«сімка», і він призначений для роботи декількох співробітників, то потрібно знати, як в Windows 7 змінити користувача. Прочитавши цю статтю, ви також навчитеся змінювати пароль і ім'я облікового запису, скориставшись зручним для вас способом. В результаті ваша інформація буде доступна тільки вам або людям, яким ви скажете свій пароль.

Як додати нову «Облікову запис»?

Щоб створити обліковий запис для нового користувача, знадобиться зайти в меню «Пуск» і клікнути по іконці, яка розташована у верхній частині вікна. Перейшовши за посиланням «Управління іншим користувачем», відзначте пункт, що дозволяє створити «учетку».

Відкриється сторінка, на якій ви побачите графу, куди знадобиться вписати своє ім'я користувача та вказати тип доступу (Адміністратор або Звичайний). Тепер натисніть «Створити обліковий запис».

Якщо ви не хочете, щоб інші люди, що працюють за вашим комп'ютером, могли видаляти програми або змінювати важливі файли, то встановіть «Звичайний доступ». Якщо ж людині повністю довіряєте, то можете дати йому права «Адміністратора».

Витративши всього кілька хвилин, ви зможете додати нового користувача на ваш ПК.

Як в "Віндовс" 7 перемикатися між обліковими записами?

Отже, якщо на вашому комп'ютері кожен користувач ПК має свою «учетку», то необхідно знати, як між ними перемикатися. Коли ви запускаєте комп'ютер, з'являється можливість вибрати того чи іншого «юзера», натиснувши на відповідну іконку. Але що робити, якщо операційна система вже завантажена? Як в Windows 7 змінити користувача?

Для того щоб переключитися з одного облікового запису на іншу, можна застосувати один із способів:

  • Одночасно натисніть кнопки «Ctrl», «alt» і «Delete». Відкриється «Початковий екран», де необхідно клікнути «Змінити користувача»;
  • Скористайтеся «гарячими кнопками» - Win + L. На клавіші «Win» зображений логотип ОС "Віндовс";
  • Увійдіть в «Пуск». Біля опції «Завершення роботи» клікніть по трикутнику, щоб викликати Виберіть варіант «Змінити користувача».

Ось так, досить просто ви можете перемикатися між «учетке» користувачів.

Як змінити Windows 7?

Кожен користувач ПК може дати свого облікового запису будь-яке ім'я або змінити вже існуюче.

Наприклад, якщо ви придбали б / у комп'ютер, то, швидше за все, захочете поміняти ім'я користувача. Зробити це можна також, скориставшись одним з двох простих способів:

  • викличте « командний рядок»І впишіть туди« lusrmgr.msc »(без лапок). З'явиться вікно, де необхідно вибрати підрозділ «Користувачі». Справа клікніть по тому «юзеру», якого бажаєте перейменувати. У контекстному меню натисніть на відповідну опцію, а потім кнопку «Enter». Тепер знову натисніть по вже перейменованому користувачеві ПКМ і перейдіть в «Властивості». Вам потрібна вкладка «Загальні». Тут ще раз вкажіть нове ім'я.
  • Увійдіть в меню «Пуск» і натисніть на квадратну іконку у верхній частині вікна. Перейдіть по посиланню «Змінити ім'я свого облікового запису». Впишіть свій варіант і натисніть "Перейменувати».

Як поміняти пароль користувача?

Ви вже знаєте як в Windows 7 змінити користувача, але що робити, якщо необхідно змінити пароль? Зробити це можна, натиснувши кнопки «Ctrl», «Delete» і «Alt». Тепер виберіть «Змінити пароль ...» і впишіть поточний пароль, а потім два рази новий. Останній крок - підтвердіть ваші дії.

Як варіант, можете зайти в «Пуск» і клікнути по іконці користувача. У вікні, перейдіть за посиланням «Зміна свого пароля». У відповідні поля впишіть діючий і новий пароль два рази.

Тепер ви зможете змінити пароль користувача Windows 7, тим самим убезпечивши себе від крадіжки цінної інформації, яка знаходиться на ваш профіль.

висновок

Отже, ви навчилися створювати облікові записи користувачів, змінювати їх ім'я та пароль. Якщо один ПК призначений для декількох людей, має сенс створити кожному з них окрему «учетку». При цьому права «Адміністратора» можуть бути тільки у вас.

Користувач зможе налаштувати зовнішній вигляд ОС так, як йому зручно. Наприклад, деякі люди бажають, щоб «Панель завдань» була розташована у верхній частині екрану або збоку. Одні «юзери» не люблять міняти стандартні шпалери Windows, Інші - хочуть бачити на робочому столі щось яскраве або смішне. Є можливість будь-яку «Облікову запис» налаштувати відповідно до своїх уподобань, а знаючи, як в Windows 7 змінити користувача, все залишаться задоволені, адже при необхідності зможуть переключитися на свою «учетку».

Якщо уважно подивитися на екран, показаний на рис. 4.8, то можна помітити ще одне цікаве нововведення в Windows XP - опцію швидкого перемикання користувачів (призначених для користувача сесій, Fast User Switching), яку слід обговорити більш докладно.

Зазначена можливість призначена для забезпечення швидкого і зручного методу посилення технології поділу даних у профілях Windows NT, а також ефективного механізму перемикання між обліковими записами користувачів.

Якщо це властивість активізовано, то користувачам немає необхідності виходити з системи (log off), оскільки облікові записи користувачів постійно підключені. Таким чином, можна швидко перемикатися між усіма відкритими обліковими записами. При цьому тим користувачам, які до цього працювали в системі, не потрібно з неї виходити і захищати свої працюючі додатки або активні сполуки з Інтернетом.

Система Windows XP з зареєстрованими в ній користувачами знову відображає вікно запрошення, в той час як всі програми продовжують виконуватися. Крім того, на екрані буде відображено кількість підключених користувачів, повідомлення про наявність непрочитаних повідомлень електронної пошти, а також кількість виконуваних програм.

Windows XP Professional також надає користувачам можливість доступу до даних і додатків з інших машин. На робочих станціях, які використовуються у сфері бізнесу, оснащених операційною системою Windows XP Professional, у користувачів є можливість одержання віддаленого доступу до своїх настільних комп'ютерів. Так, наприклад, ви можете заблокувати свій офісний комп'ютер, піти додому, і підключитися до нього з дому. \u003e

Мал. 4.9. вкладка автономні файли вікна Властивості папки

Примітка : Обидві функціональних можливості - Fast User Switching і Remote Desktop - використовують технологію термінальних служб і дозволяють працювати з більш ранніми додатками Microsoft Win32, не вимагаючи при цьому внесення в них будь-яких змін. Якщо додаток, яке ви використовуєте, сертифіковане для роботи в Windows 2000, або відповідає специфікації "Application Specification for Windows 2000", то воно буде успішно виконуватися і в Windows XP.

Слід зазначити, що можливість швидкого перемикання користувачів не буде діяти на робочих станціях під керуванням Windows XP Professional, що входять в домен.

У системах Windows XP Home Edition або Windows XP Professional, що функціонують на автономних робочих станціях або входять до складу робочих груп, передбачена можливість включення / блокування режиму Fast User Switching, шляхом установки / скидання прапорця (Use Fast User Switching). Якщо цей прапорець затінений, як показано на рис. 4.8, відкрийте вікно Властивості папки (Folder Options), перейдіть на вкладку автономні файли (Offline Files) (рис. 4.9) і скиньте прапорець Використовувати автономні файли (Enable Offline Files). Підтвердіть внесені зміни, а потім знову відкрийте вікно облікові записи користувачів (User Accounts). прапорець Використовувати швидке перемикання користувачів (Use Fast User Switching) тепер стане доступним (рис. 4.10). \u003e

Мал. 4.10. прапорець Використовувати швидке перемикання користувачів став доступним

Гугленіе видало:

  • Для перемикання сесій використовуйте функції wtsapi32.dll: WTSEnumerateSessions, WTSConnectSession, WTSDisconnectSession (Зараз, коли дивлюся опис цих функцій, воно говорить що працює з віддаленими робочими сесіями, і чесно-кажучи, я в невеликому здивуванні, але у мене працює локально, бездоганно) .
  • Для хоткеев, використовуйте функції user32.dll: RegisterHotKey, UnregisterHotKey. Тут все просто.

Відразу обмовлюся, і можете кидати в мене помідорами, але писав я цю справу на c #, хоча на плюсах, було б звичайно краще, нативної і ін, ін, ін ... Але, тоді я тільки почав освоювати c # і потрібен був досвід, а коли рішення було написано, переписувати його не було необхідності, хоча перенесення його не займе більше одного вечора.

Отже, для початку було написано просте win32 додаток з кнопочкою, після натискання якої виконувався приблизно такий код:

Private void SwitchUser () (IntPtr buffer \u003d IntPtr.Zero; int count \u003d 0; // отримуємо список сесій, в яких виконаний вхід if (WTSEnumerateSessions (WTS_CURRENT_SERVER_HANDLE, 0, 1, ref buffer, ref count)) (WTS_SESSION_INFO sessionInfo \u003d new WTS_SESSION_INFO; // найскладніша частина: // акуратно перетворити некеровану пам'ять в керовану for (int index \u003d 0; index< count; index++) sessionInfo = (WTS_SESSION_INFO)Marshal.PtrToStructure((IntPtr)((int)buffer + (Marshal.SizeOf(new WTS_SESSION_INFO()) * index)), typeof(WTS_SESSION_INFO)); int activeSessId = -1; int targetSessId = -1; // получаем Id активного, и неактивного сеанса // 0 пропускаем, там всегда "Services" for (int i = 1; i < count; i++) { if (sessionInfo[i].State == WTS_CONNECTSTATE_CLASS.WTSDisconnected) targetSessId = sessionInfo[i].SessionId; else if (sessionInfo[i].State == WTS_CONNECTSTATE_CLASS.WTSActive) activeSessId = sessionInfo[i].SessionId; } if ((activeSessId > 0) && (targetSessId\u003e 0)) (// якщо є неактивний сеанс, то перемикається на нього. WTSConnectSession (Convert.ToUInt64 (targetSessId), Convert.ToUInt64 (activeSessId), "", false);) else (// якщо неактивних немає. просто відключаємося (переходимо на екран вибору користувача) WTSDisconnectSession (WTS_CURRENT_SERVER_HANDLE, activeSessId, false);)) // обов'язково чистимо пам'ять WTSFreeMemory (buffer); )

При двох сеансах sessionInfo матиме 3 елементи: сеанс служб, сеанс 1-го користувача, сеанс 2-го користувача. Відповідно targetSessId і activeSessId визначаться однозначно. При сеансах більше 2, перемикання буде відбуватися між активним і останнім неактивним.

Але тут мене спіткала невелика невдача. Деякі вже могли здогадатися, що так справа не піде. У момент виконання WTSConnectSession з програми, відключення активного користувача відбувається, а ось включення другого користувача - немає. Тобто простіше кажучи, додаток одного користувача не може ініціювати вхід іншого користувача. Але це може зробити служба! Так, дуже шкода, але без системної служби у нас нічого не вийде. Добре, створимо системну службу в яку закинемо цей код. Ось тут-то і стане в нагоді C # і.Net, так як написати службу на цих технологіях дуже і дуже просто. Тепер виникає наступна проблема: служба не має призначеного для користувача інтерфейсу, тобто користувач не може безпосередньо вплинути на роботу служби, а служба не може почути дії користувача. Навісити хоткей на службу не можна.

Отже, ось наше рішення:
Користувача додаток слухає користувача, і при виявленні хоткея, посилає сигнал системної службі, яка і виконує перемикання.

Залишилося зовсім небагато, але і тут мені знайдеться що вам показати. Наприклад те, що нам потрібно десктопних програм, без вікон, але щоб воно приймало хоткеі. Це можна зробити так, як роблять усі: Приховати головне вікно програми, але не показувати. Але є рішення краще. Написати свій ApplicationContext. З блек
Наприклад такий:

Internal class SUApplicationContext: ApplicationContext (private Hotkey hk; private Form form; private const int SWITCH_USER_COMMAND \u003d 193; internal SUApplicationContext () (// тільки створюємо форму, вона все одно потрібна // щоб слухати хоткеі form \u003d new Form (); // створюємо глобальний хоткей Win + A hk \u003d new Hotkey (Keys.A, false, false, false, true); // делегуємо обробник події hk.Pressed + \u003d delegate (SendSwitchCommand ();); // реєструємо хоткей, якщо можемо if (hk.GetCanRegister (form)) hk.Register (form); // Вішаємо подія на вихід Application.ApplicationExit + \u003d Application_ApplicationExit;) private void SendSwitchCommand () (// Описуємо нашу службу ServiceController sc \u003d new ServiceController ( "Sus") ; try (// посилаємо їй команду sc.ExecuteCommand (SWITCH_USER_COMMAND);) catch (Exception ex) (MessageBox.Show (ex.Message);)) void Application_ApplicationExit (object sender, EventArgs e) (// при виході разрегістріруем хоткей if (hk.Registered) hk.Unregister (); )) Static void Main () (Application.EnableVisualStyles (); Application.SetCompatibleTextRenderingDefault (false); Application.Run (new SUApplicationContext ());)

Тут я використовую знайдений на просторах інтернету інтерфейс MovablePython.Hotkey над user32.dll функціями RegisterHotKey, UnregisterHotKey.

І пару рядків про саму службу.

Protected override void OnCustomCommand (int command) (base.OnCustomCommand (command); if (command \u003d\u003d SWITCH_USER_COMMAND) (SwitchUser ();))

Переобумовленої подія OnCustomCommand, і при отриманні нашої команди, виконуємо вже відому нам функцію.

Залишилося зареєструвати і запустити службу, і поставити в автозавантаження кожному користувачеві додаток.

Усе. Тепер після того, як увійшов перший користувач після запуску комп'ютера і натиснув Win + A, його сеанс відключається, і з'являється вікно вибору користувача. Входить другий користувач, натискає Win + A - з'являється сеанс першого користувача. І т.д.

На github ви можете ознайомитися з кодами. Або можете завантажити весь проект і скомпільовані і готові до роботи виконувані файли.