首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在windows 10中,重定向端口监视器(redmon),以用户身份运行不起作用

在windows 10中,重定向端口监视器(redmon),以用户身份运行不起作用
EN

Stack Overflow用户
提问于 2018-01-11 21:44:46
回答 1查看 5.5K关注 0票数 3

我有一个重定向打印机端口,使用redmon (重定向端口监视器)与postscript打印机驱动程序转换postscript到pdf,并应用一些其他效果,如水印,覆盖等在win7所有工作正常,但在windows10进程运行在系统用户帐户下。在打印机端口的配置窗口中有一个名为“以用户身份运行”的标志,在win7中,选中此标志将使作业在用户帐户下运行。在Windows10中,这似乎不起作用。任何建议都将不胜感激。谢谢。罗伊

EN

回答 1

Stack Overflow用户

发布于 2018-02-16 04:23:02

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

下面的代码是我放在程序开头的代码。不要被从main()开始的程序所欺骗。我使用的是一个GUII工具包,其中包含WinMain(),然后调用main()。我只在ASCII程序上测试过代码。我试图使用ASCII版本的调用,这样它就可以与非ASCII程序一起工作,但我不确定我是否得到了所有的调用。

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

祝好运。

代码语言:javascript
复制
#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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48208509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档