在Windows 10中,重定向端口监视器(redmon),在用户无法运行时运行

时间:2018-01-11 13:44:46

标签: pdf printing windows-10 ghostscript redmon

我有一个重定向的打印机端口,它使用redmon(重定向端口监视器)和postscript打印机驱动程序将postscript转换为pdf并应用其他一些效果,如水印,叠加等。 在win 7中,所有工作都很好,但在Windows 10中,该过程在系统用户帐户下运行。 在打印机端口的配置窗口中有一个名为“以用户身份运行”的标志,在win7中,检查此标志可使作业在用户帐户下运行。 在Windows 10中,它似乎无法正常工作。 任何建议将非常感谢。 谢谢。 罗伊

1 个答案:

答案 0 :(得分:0)

我有类似的问题。我需要打印文档的用户选择文档类型和患者ID。然后将文档以PDF格式打印到我们的EHR系统。选中“以用户身份运行”时在Windows 7中工作,但在Windows 10上不可用.Redmon始终将程序作为“SYSTEM”运行。所以我在程序的开头添加了一点来检查用户名。如果是“SYSTEM”,程序将通过查找explorer.exe的实例来查找系统上的交互式用户。如果多个交互式用户登录到系统,则会失败。对我的任务来说不是问题。然后程序启动另一个自身运行实例,与explorer.exe运行相同的用户,并传递相同的命令行。使用管道,以便第一个实例的stdin可以通过管道输送到第二个实例上的stdin。另一个限制是在64位操作系统上,必须使用64位版本的程序。否则可能找不到explorer.exe。

以下代码是我在程序开头放置的代码。不要被从main()开始的程序所迷惑。我正在使用一个包含WinMain()的GUII工具包,然后调用main()。我只测试了ASCII程序的代码。我尝试使用ASCII版本的调用,以便它可以与非ASCII程序一起使用,但我不确定我是否得到了所有这些。

LogInfoSys(“Hello World”);函数只写入日志文件。

祝你好运。

#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <time.h>
#include <direct.h>
#include <process.h>
#include <sqlext.h>
#include <Psapi.h>
#include <tlhelp32.h>

int main(int argc, char *argv[])
{
    int                                         error;
    char                                        msg[1024];

    DWORD                                       *processIDs;
    int                                         processCount;
    HANDLE                                      hProcess = NULL;
    HANDLE                                      hToken;
    char                                        userName[64];
    char                                        progName[1024];
    int                                         i, j;
    char                                        nameMe[256];
    char                                        domainMe[256];
    PTOKEN_USER                                 ptuMe = NULL;
    PROCESS_INFORMATION                         procInfo;
    STARTUPINFO                                 startUpInfo;
    HMODULE                                     *hMod;
    DWORD                                       cbNeeded;
    SECURITY_ATTRIBUTES                         saAttr;
    HANDLE                                      hChildStd_IN_Rd = NULL;
    HANDLE                                      hChildStd_IN_Wr = NULL;

    i = 64;                                 // Get user name, if it is "SYSTEM" redirect input to output to a new instance of the program
    GetUserNameA(userName, &i);
    if (_stricmp(userName, "system") == 0)
    {
        LogInfoSys("Running as SYSTEM");
        processIDs = (DWORD *)calloc(16384, sizeof(DWORD));                             // Look for explorer.exe running.  If found that should be the user we want to run as.
        EnumProcesses(processIDs, sizeof(DWORD) * 16384, &i);                           // If there is more than one that is OK as long as they are both being run by the same
        processCount = i / sizeof(DWORD);                                               // user.  If more than one user is logged on, this will be a problem.

        hMod = (HMODULE *)calloc(4096, sizeof(HMODULE));

        hProcess = NULL;
        for (i = 0; (i < processCount) && (hProcess == NULL); i++)
        {
            if (processIDs[i] == 11276)
                Sleep(0);
            if (processIDs[i] != 0)
            {
                hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processIDs[i]);
                if (hProcess != NULL)
                {
                    cbNeeded = 0;
                    error = EnumProcessModules(hProcess, hMod, sizeof(HMODULE) * 4096, &cbNeeded);
                    if (error == 0)
                    {
                        error = GetLastError();
                        Sleep(0);
                    }
                    progName[0] = 0;
                    error = GetModuleBaseNameA(hProcess, hMod[0], progName, 1024);
                    if (error == 0)
                    {
                        error = GetLastError();
                        Sleep(0);
                    }
                    if (_stricmp(progName, "explorer.exe") != 0)
                    {
                        CloseHandle(hProcess);
                        hProcess = NULL;
                    }
                    else
                    {
                        LogInfoSys("Found explorer.exe");
                    }
                }
            }
        }

        LogInfoSys("After looking for processes.");
        nameMe[0] = domainMe[0] = 0;
        if (hProcess != NULL)
        {
            saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
            saAttr.bInheritHandle = TRUE;
            saAttr.lpSecurityDescriptor = NULL;

            if (!CreatePipe(&hChildStd_IN_Rd, &hChildStd_IN_Wr, &saAttr, 0))        // Create a pipe for the child process's STDIN.
                LogInfoSys("Stdin CreatePipe error");

            if (!SetHandleInformation(hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0))     // Ensure the write handle to the pipe for STDIN is not inherited. 
                LogInfoSys("Stdin SetHandleInformation errir");

            if (OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken) != 0)
            {
                GetStartupInfo(&startUpInfo);
                startUpInfo.cb = sizeof(STARTUPINFO);
                startUpInfo.lpReserved = NULL;
                startUpInfo.lpDesktop = NULL;
                startUpInfo.lpTitle = NULL;
                startUpInfo.dwX = startUpInfo.dwY = 0;
                startUpInfo.dwXSize = 0;
                startUpInfo.dwYSize = 0;
                startUpInfo.dwXCountChars = 0;
                startUpInfo.dwYCountChars = 0;
                startUpInfo.dwFillAttribute = 0;
                startUpInfo.dwFlags |= STARTF_USESTDHANDLES;
                startUpInfo.wShowWindow = 0;
                startUpInfo.cbReserved2 = 0;
                startUpInfo.lpReserved = NULL;
                startUpInfo.hStdInput = hChildStd_IN_Rd;
                startUpInfo.hStdOutput = NULL;
                startUpInfo.hStdError = NULL;

                GetModuleFileName(NULL, progName, 1024);
                i = CreateProcessAsUserA(hToken, progName, GetCommandLine(), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startUpInfo, &procInfo);
                if (i == 0)
                {
                    i = GetLastError();
                }

                do
                {
                    i = (int)fread(msg, 1, 1024, stdin);
                    if (i > 0)
                        WriteFile(hChildStd_IN_Wr, msg, i, &j, NULL);
                } while (i > 0);
            }
        }
        LogInfoSys("End of running as SYSTEM.");
        exit(0);
    }


    /**********************************************************************************************************
    *
    *   End of running as SYSTEM and start of running as the user that printed the document (I hope).
    *
    **********************************************************************************************************/
    exit(0);
}