Запуск формы в Windows Logon Screen C # - PullRequest
0 голосов
/ 28 февраля 2012

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

Я уже нашел этот вопрос (и ответ): Запуск процесса на экране приветствия 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-import, поэтому я не могу это построить.

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

...