Re: Как создать форму аутентификации подобную WinLogon
От: Osaka  
Дата: 13.04.12 08:04
Оценка: -1 :))
Следующий вопрос будет о том как получать платные смс?
Данное сообщение является художественным произведением и освещает вымышленные события в вымышленном мире. Все совпадения с реальностью являются случайными. Не является инвестиционной рекомендацией.
Как создать форму аутентификации подобную WinLogon
От: nicksnz  
Дата: 13.04.12 05:55
Оценка:
Здравствуйте,
как создать форму аутентификации подобную WinLogon?

Задача состоит в том, чтобы во время запуска формы аутентификации скрыть от пользователя вывод приложений и запретить ввод пользователя.
Нашел WinApi-функции CreateDesktop и SwithDesktop по работе с рабочими столами, но столкнулся с двумя проблемами:
— не могу отобразить формы одного приложения на разных рабочих столах;
— не могу уничтожить рабочий стол через CloseDesktop.

Пробовал скрывать и показывать формы через WinApi-функцию ShowWindow, но код напоминает больше кучу костылей, чем хорошую реализацию аутентификакции.

Данное приложение не может использовать пользователей Windows. Данные о пользователях и правах доступа хранятся в специализированной базе данных.

Может есть подобная технология, уже внедренная в операционные системы Windows 2003 Server и новее.
c# winforms authentication winlogon
Re: Как создать форму аутентификации подобную WinLogon
От: okman Беларусь https://searchinform.ru/
Дата: 13.04.12 06:47
Оценка:
Здравствуйте, nicksnz, Вы писали:

N>как создать форму аутентификации подобную WinLogon?


N>Задача состоит в том, чтобы во время запуска формы аутентификации скрыть от пользователя вывод приложений и запретить ввод пользователя.

N>Нашел WinApi-функции CreateDesktop и SwithDesktop по работе с рабочими столами, но столкнулся с двумя проблемами:
N>- не могу отобразить формы одного приложения на разных рабочих столах;
N>- не могу уничтожить рабочий стол через CloseDesktop.

N>Пробовал скрывать и показывать формы через WinApi-функцию ShowWindow, но код напоминает больше кучу костылей, чем хорошую реализацию аутентификакции.


N>Данное приложение не может использовать пользователей Windows. Данные о пользователях и правах доступа хранятся в специализированной базе данных.


N>Может есть подобная технология, уже внедренная в операционные системы Windows 2003 Server и новее.


Есть gina.dll (NT 5.x) и credential provider (NT 6.x), но эти технологии охватывают только вход в систему.
Если нужно показывать форму уже после входа в систему, то здесь, видимо, обрадовать нечем.
Чтобы Вы не сделали с переключением рабочих столов — это пресекается Alt+Ctrl+Del (SAS).
Ну разве что остается какой-нибудь фильтр на клавиатуру поставить, хотя здесь уже попахивает зловредами.
Re[2]: Как создать форму аутентификации подобную WinLogon
От: nicksnz  
Дата: 13.04.12 12:31
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, nicksnz, Вы писали:


O>Если нужно показывать форму уже после входа в систему, то здесь, видимо, обрадовать нечем.


Форма отображается после входа в систему.

O>Чтобы Вы не сделали с переключением рабочих столов — это пресекается Alt+Ctrl+Del (SAS).

O>Ну разве что остается какой-нибудь фильтр на клавиатуру поставить, хотя здесь уже попахивает зловредами.

Alt+Ctrl+Del блокируется через локальную политику безопасности.
Re: Как создать форму аутентификации подобную WinLogon
От: Аноним  
Дата: 13.04.12 13:32
Оценка:
Здравствуйте, nicksnz, Вы писали:

N>Здравствуйте,

N>как создать форму аутентификации подобную WinLogon?

N>Задача состоит в том, чтобы во время запуска формы аутентификации скрыть от пользователя вывод приложений и запретить ввод пользователя.

N>Нашел WinApi-функции CreateDesktop и SwithDesktop по работе с рабочими столами, но столкнулся с двумя проблемами:
N>- не могу отобразить формы одного приложения на разных рабочих столах;
N>- не могу уничтожить рабочий стол через CloseDesktop.

N>Пробовал скрывать и показывать формы через WinApi-функцию ShowWindow, но код напоминает больше кучу костылей, чем хорошую реализацию аутентификакции.


N>Данное приложение не может использовать пользователей Windows. Данные о пользователях и правах доступа хранятся в специализированной базе данных.


N>Может есть подобная технология, уже внедренная в операционные системы Windows 2003 Server и новее.


можно просто создать окно на весь экран и сделать его топмост
тк оно будет поверх всех окон то проблематично будет что-то увидеть
Re[3]: Как создать форму аутентификации подобную WinLogon
От: okman Беларусь https://searchinform.ru/
Дата: 14.04.12 09:25
Оценка:
Здравствуйте, nicksnz, Вы писали:

N>Alt+Ctrl+Del блокируется через локальную политику безопасности.


Во-первых, Alt+Ctrl+Del не блокируется, блокируются лишь определенные способы входа-выхода.
А во-вторых, ничего себе у Вас размах ! А если пользователю нужен диспетчер задач, чтобы
завершить повисшее приложение или узнать сколько в системе свободной памяти ?
Re: Как создать форму аутентификации подобную WinLogon
От: nicksnz  
Дата: 19.04.12 03:06
Оценка:
Решение:

через создание рабочего стола

1) описываем ссылки на WinApi функции

[StructLayout(Sequental, Unicode)]
public struct SECURITY_ATTRIBUTES{ public Int32 nLength, SecurityDescriptor, bInheritHandle; }

описываем ссылки на WinApi функции OpenDesktop, SwitchDesktop, SetThreadDesktop

[DllImport("user32.dll", Unicode)]
public static extern IntPtr CreateDesktop (string,string,Int32,UInt32,UInt32,IntPtr);

2) Когда нужно показать форму аутентификации,

2А) создаем новый поток, создаем рабочий стол для аутентификации (или открываем его) и создаем форму аутентификации


Thread thread = new Thread(new ThreadStart(()=>
{
logonDsk = createLoginDesk();
SetThreadDesktop(logonDsk);
SwitchDesktop(logonDsk);

loginForm = new LoginForm();
dlgResult = loginForm.ShowDialog();

var newdsk = OpenDesktop("Default",1,true,0x10000000);
SetThreadDesktop(newdsk);
SwitchDesktop(newdsk);
}));

2Б) функция createLoginDesk — создание рабочего стола для аутентификации (или открытие его)
string dskName = "Logon desktop";
SECURITY_ATTRIBUTES sAtt = new SECURITY_ATTRIBUTES(){nLength=Marshal.SizeOf(typeof(SECURITY_ATTRIBUTES)), bInheritHandle=1};
sAtt.lpSecurityDescriptor =0;

IntPtr hglobal = Marshal.AllocHGlobal(Marshal.SizeOf(sAtt));
Marshal.StructureToPtr(sAtt, hglobal, false);

IntPtr logonDsk = CreateDesktop (dskName, null, 0, 1, 0x10000000, hglobal);

Marshal.FreeHGlobal(hglobal);

3b) Когда форму показали, ждем завершения созданного потока и получаем данные из формы аутентификации, ссылку на которую заранее запомнили
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.