Создайте интерактивную сессию входа в систему

Я пытаюсь создать утилиту, подобную заброшенному Супер Быстрому Пользовательскому Переключателю Microsoft (загрузка), которая позволяет быстрое переключение между пользователями, не проходя Экран приветствия.

У меня есть рабочая реализация с помощью недокументированного WinStationConnectW API (наряду с WTSEnumerateSessions), но это может только переключиться на пользователя, который уже зарегистрирован.

Как я могу создать сессию входа в систему так, чтобы она могла переключиться на пользователя, который не зарегистрирован?
Я только должен поддерживать XP, хотя было бы хорошо работать над Vista / Семь. (Мой текущий код уже делает),

Я знаю, что это возможно, потому что Супер Быстрый Пользовательский Переключатель делает это. (Хотя этому нужна служба Windows, чтобы сделать это),

Я пишу C#, но я могу перевести любой ответ в C#.

8
задан SLaks 25 January 2010 в 19:11
поделиться

2 ответа

Я решил это в XP, позвонив беспрепятственно функцию initiateInteractivelogon в Shelllocalmachine COM объекта Shgina.dll .

Этот метод, который может быть вызван только на локальной системной учетной записи, будет регистрировать пользователя на консоль. (Он не может регистрировать пользователя на сеанс RDP)

Версия DLL, включенной с Windows 7 (и предположительно также Vista) не содержит этого метода.

4
ответ дан 6 December 2019 в 00:07
поделиться

Поскольку вы имеете в виду

extern "C" { ... }

охранников стиля, они объявляют некоторые функции связями «C», а не «C++» связями (которые обычно имеют множество дополнительных украшений имен для поддержки таких вещей, как перегруженные функции).

Конечно, цель состоит в том, чтобы позволить коду C++ взаимодействовать с кодом C, который обычно находится в библиотеке. Если заголовки библиотеки не были написаны с учетом языка C++, , то они не будут включать внешние «C» защитные элементы для языка C++ .

Заголовок C, написанный с учетом C++, будет включать что-то по линии

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif

, чтобы убедиться, что программы C++ видят правильную связь. Однако не все библиотеки были написаны с учетом языка C++, поэтому иногда приходится делать

extern "C" {
#include "myclibrary.h"
}

, чтобы получить правильную связь. Если файл заголовка предоставляется кем-то другим, то это не является хорошей практикой, чтобы изменить его (потому что тогда вы не можете обновить его легко), поэтому лучше обернуть файл заголовка своей собственной защитой (возможно, в свой собственный файл заголовка).

extern «C» не является (AFAIK) ANSI C, поэтому не может быть включен в обычный код C без защиты препроцессора.

В ответ на изменение:

Если вы используете компилятор C++ и объявляете функцию как extern «C» в файле заголовка, вам не нужно также объявлять эту функцию как extern «C» в файле реализации. Из раздела 7.5 стандарта C++ (ударение мое):

Если два объявления одного и того же функция или объект указывают различные связь-спецификации (то есть связь-спецификации этих объявления указывают различные string-literals), программа плохо сформирован, если декларации появляются в одном и том же блоке перевода и одно правило определения применяется, если объявления появляются в различные единицы перевода. Кроме для функций с C++ связью, a объявление функции без связи спецификация не должна предшествовать первая спецификация связи для этого функция. Функция может быть объявлена без спецификации связи после спецификация явной связи имеет были замечены; связь явно указано в более ранней декларации не затрагивается такой функцией объявление.

Я не убежден, что это хорошая практика, однако, поскольку существует вероятность того, что спецификации связей могут случайно расходиться (если, например, файл заголовка, содержащий спецификацию связей, не включен в файл реализации). Я думаю, что лучше быть явным в файле реализации.

-121--1659202-

Какие версии Windows вы хотите использовать?

Я считаю, что нет простого способа. Для Windows XP существует GINA . Для Windows Vista существуют поставщики мандатов.

Кроме того, если вы нацелены на Windows XP, вы можете создать службу, которая отправляет нажатия клавиш на рабочий стол WinLogon для входа в систему, как если бы пользователь нажал их на клавиатуре. Это было сделано RealVNC или UltraVNC, я не помню. Однако этот подход не работает в Windows Vista.

0
ответ дан 6 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: