Я пытаюсь создать утилиту, подобную заброшенному Супер Быстрому Пользовательскому Переключателю Microsoft (загрузка), которая позволяет быстрое переключение между пользователями, не проходя Экран приветствия.
У меня есть рабочая реализация с помощью недокументированного WinStationConnectW
API (наряду с WTSEnumerateSessions
), но это может только переключиться на пользователя, который уже зарегистрирован.
Как я могу создать сессию входа в систему так, чтобы она могла переключиться на пользователя, который не зарегистрирован?
Я только должен поддерживать XP, хотя было бы хорошо работать над Vista / Семь. (Мой текущий код уже делает),
Я знаю, что это возможно, потому что Супер Быстрый Пользовательский Переключатель делает это. (Хотя этому нужна служба Windows, чтобы сделать это),
Я пишу C#, но я могу перевести любой ответ в C#.
Я решил это в XP, позвонив беспрепятственно функцию initiateInteractivelogon
в Shelllocalmachine
COM объекта Shgina.dll
.
Этот метод, который может быть вызван только на локальной системной учетной записи, будет регистрировать пользователя на консоль. (Он не может регистрировать пользователя на сеанс RDP)
Версия DLL, включенной с Windows 7 (и предположительно также Vista) не содержит этого метода.
Поскольку вы имеете в виду
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.