Как запустить приложение на экране входа в систему
Я создаю программу входа в систему лица в VB.NET. Я хочу показать форму распознавания лиц на экране входа в систему.
Для тестирования Я заменил "osk.exe" с моим приложением, и запустить его с экрана входа в систему, "все работает хорошо". Но я не могу сказать "конечному пользователю", что нужно заменить файл, а затем запустить его.
Я знаю, что службы Windows могут запускаться до того, как пользователь сможет войти в систему, а также у меня есть код для запуска приложения из службы windows. Но он может запускать программу только в активном пользовательском сеансе. Но я хочу, чтобы он работал вместе с "LogonUI.exe" который работает под управлением пользователя "NT AUTHORITY\SYSTEM". Как я могу это сделать? Есть ли какой-либо другой способ запустить приложение на экране входа в систему?
Заранее спасибо.
Что я уже пробовал:
Код, который запускает процесс :
Dim UserTokenHandle As IntPtr = IntPtr.Zero WindowsApi.WTSQueryUserToken(WindowsApi.WTSGetActiveConsoleSessionId, UserTokenHandle) Dim ProcInfo As New WindowsApi.PROCESS_INFORMATION Dim StartInfo As New WindowsApi.STARTUPINFOW StartInfo.cb = CUInt(Runtime.InteropServices.Marshal.SizeOf(StartInfo)) WindowsApi.CreateProcessAsUser(UserTokenHandle, "C:\FaceLogon\Recognizer.exe", IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, False, 0, IntPtr.Zero, Nothing, StartInfo, ProcInfo) If Not UserTokenHandle = IntPtr.Zero Then WindowsApi.CloseHandle(UserTokenHandle) End If
Класс WindowsApi:
Imports System.Runtime.InteropServices Public Class WindowsApi <DllImport("kernel32.dll", EntryPoint:="WTSGetActiveConsoleSessionId", SetLastError:=True)> _ Public Shared Function WTSGetActiveConsoleSessionId() As UInteger End Function <DllImport("Wtsapi32.dll", EntryPoint:="WTSQueryUserToken", SetLastError:=True)> _ Public Shared Function WTSQueryUserToken(ByVal SessionId As UInteger, ByRef phToken As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function <DllImport("kernel32.dll", EntryPoint:="CloseHandle", SetLastError:=True)> _ Public Shared Function CloseHandle(<InAttribute()> ByVal hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function <DllImport("advapi32.dll", EntryPoint:="CreateProcessAsUserW", SetLastError:=True)> _ Public Shared Function CreateProcessAsUser(<InAttribute()> ByVal hToken As IntPtr, _ <InAttribute(), MarshalAs(UnmanagedType.LPWStr)> ByVal lpApplicationName As String, _ ByVal lpCommandLine As System.IntPtr, _ <InAttribute()> ByVal lpProcessAttributes As IntPtr, _ <InAttribute()> ByVal lpThreadAttributes As IntPtr, _ <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandles As Boolean, _ ByVal dwCreationFlags As UInteger, _ <InAttribute()> ByVal lpEnvironment As IntPtr, _ <InAttribute(), MarshalAsAttribute(UnmanagedType.LPWStr)> ByVal lpCurrentDirectory As String, _ <InAttribute()> ByRef lpStartupInfo As STARTUPINFOW, _ <OutAttribute()> ByRef lpProcessInformation As PROCESS_INFORMATION) As <MarshalAs(UnmanagedType.Bool)> Boolean End Function <StructLayout(LayoutKind.Sequential)> _ Public Structure SECURITY_ATTRIBUTES Public nLength As UInteger Public lpSecurityDescriptor As IntPtr <MarshalAs(UnmanagedType.Bool)> _ Public bInheritHandle As Boolean End Structure <StructLayout(LayoutKind.Sequential)> _ Public Structure STARTUPINFOW Public cb As UInteger <MarshalAs(UnmanagedType.LPWStr)> _ Public lpReserved As String <MarshalAs(UnmanagedType.LPWStr)> _ Public lpDesktop As String <MarshalAs(UnmanagedType.LPWStr)> _ Public lpTitle As String Public dwX As UInteger Public dwY As UInteger Public dwXSize As UInteger Public dwYSize As UInteger Public dwXCountChars As UInteger Public dwYCountChars As UInteger Public dwFillAttribute As UInteger Public dwFlags As UInteger Public wShowWindow As UShort Public cbReserved2 As UShort Public lpReserved2 As IntPtr Public hStdInput As IntPtr Public hStdOutput As IntPtr Public hStdError As IntPtr End Structure <StructLayout(LayoutKind.Sequential)> _ Public Structure PROCESS_INFORMATION Public hProcess As IntPtr Public hThread As IntPtr Public dwProcessId As UInteger Public dwThreadId As UInteger End Structure End Class