Запуск формы на экране входа в Windows C#

Мне нужно написать небольшой инструмент, который запускается на каждом рабочем столе пользователя или, если никто не вошел в систему, непосредственно на экране входа в систему. Может быть, служба с формой запуска?

Я уже нашел этот вопрос (и ответ): Запуск процесса в экран приветствия Windows 7

// grab the winlogon process
    Process winLogon = null;
    foreach (Process p in Process.GetProcesses()) {
        if (p.ProcessName.Contains("winlogon")) {
            winLogon = p;
            break;
        }
    }
    // grab the winlogon's token
    IntPtr userToken = IntPtr.Zero;
    if (!OpenProcessToken(winLogon.Handle, TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_DUPLICATE, out userToken)) {
        log("ERROR: OpenProcessToken returned false - " + Marshal.GetLastWin32Error());
    }

    // create a new token
    IntPtr newToken = IntPtr.Zero;
    SECURITY_ATTRIBUTES tokenAttributes = new SECURITY_ATTRIBUTES();
    tokenAttributes.nLength = Marshal.SizeOf(tokenAttributes);
    SECURITY_ATTRIBUTES threadAttributes = new SECURITY_ATTRIBUTES();
    threadAttributes.nLength = Marshal.SizeOf(threadAttributes);
    // duplicate the winlogon token to the new token
    if (!DuplicateTokenEx(userToken, 0x10000000, ref tokenAttributes, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
        TOKEN_TYPE.TokenImpersonation, out newToken)) {
        log("ERROR: DuplicateTokenEx returned false - " + Marshal.GetLastWin32Error());
    }
    TOKEN_PRIVILEGES tokPrivs = new TOKEN_PRIVILEGES();
    tokPrivs.PrivilegeCount = 1;
    LUID seDebugNameValue = new LUID();
    if (!LookupPrivilegeValue(null, SE_DEBUG_NAME, out seDebugNameValue)) {
        log("ERROR: LookupPrivilegeValue returned false - " + Marshal.GetLastWin32Error());
    }
    tokPrivs.Privileges = new LUID_AND_ATTRIBUTES[1];
    tokPrivs.Privileges[0].Luid = seDebugNameValue;
    tokPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    // escalate the new token's privileges
    if (!AdjustTokenPrivileges(newToken, false, ref tokPrivs, 0, IntPtr.Zero, IntPtr.Zero)) {
        log("ERROR: AdjustTokenPrivileges returned false - " + Marshal.GetLastWin32Error());
    }
    PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
    STARTUPINFO si = new STARTUPINFO();
    si.cb = Marshal.SizeOf(si);
    si.lpDesktop = "Winsta0\\Winlogon";
    // start the process using the new token
    if (!CreateProcessAsUser(newToken, process, process, ref tokenAttributes, ref threadAttributes,
        true, (uint)CreateProcessFlags.CREATE_NEW_CONSOLE | (uint)CreateProcessFlags.INHERIT_CALLER_PRIORITY, IntPtr.Zero,
        logInfoDir, ref si, out pi)) {
        log("ERROR: CreateProcessAsUser returned false - " + Marshal.GetLastWin32Error());
    }

    Process _p = Process.GetProcessById(pi.dwProcessId);
    if (_p != null) {
        log("Process " + _p.Id + " Name " + _p.ProcessName);
    } else {
        log("Process not found");
    }

Но импорт dll не объясняется, поэтому я не могу это построить.

Спасибо за ваши усилия Fluxer


person MariusK    schedule 28.02.2012    source источник
comment
Импортом в этом примере являются все недекорированные вызовы функций: OpenProcessToken, структуры с заглавными буквами; SECURITY_ATTRIBUTES() и константы: TOKEN_QUERY - поищите их на @ pinvoke.net - и повторите второй ответ Вам действительно нужна веская причина для этого   -  person Alex K.    schedule 28.02.2012
comment
да, у меня есть веская причина сделать это. Я уже много импортировал, но он не перестает просить больше импорта ;-) не могли бы вы продолжить / перечислить все импорты для меня?   -  person MariusK    schedule 28.02.2012
comment
Вы просите нас сделать всю вашу работу здесь? ... это действительно много работы - почему бы вам просто не связаться с автором ответа, который вы скопировали здесь?   -  person Random Dev    schedule 28.02.2012
comment
да, Карстен, ты прав. извините, я не знал, что такое pinvoke. я скопировал и вставил много кода сейчас. и это работает. я удалю все лишнее и напишу пример кода в качестве ответа на понравившийся вопрос для других парней с этой проблемой.   -  person MariusK    schedule 28.02.2012
comment
@FLuXeR: Вы уверены, что вам действительно нужно это сделать? Должны быть сотни альтернативных способов добиться желаемого без изменения экрана входа в систему.   -  person Christian Hayter    schedule 28.02.2012
comment
хм ... моя задача - открыть небольшое приложение, которое показывает некоторую информацию о компьютере и некоторых программах в графическом интерфейсе.   -  person MariusK    schedule 28.02.2012
comment
Кто-нибудь знает, почему я не могу запускать приложения, которых нет в C:\windows\system32? только эта папка вроде работает..   -  person MariusK    schedule 28.02.2012