Running a Form in Windows Logon Screen C#

自古美人都是妖i 提交于 2019-12-31 04:38:08

问题


I need to write a small tool that runs on every userdesktop or, if no one is logged in, directly on logon screen. Maybe a service with a form starting?

I already found this question (and answer): Running a process at the Windows 7 Welcome Screen

// 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");
    }

But there are no dll-imports explained, so i can't build this.

Thanks for your effort Fluxer

来源:https://stackoverflow.com/questions/9481621/running-a-form-in-windows-logon-screen-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!