3

我创建了一个非常小的 win32 控制台应用程序 (AddPrintMonitor.exe),它只是调用 AddMonitor。这是一个小片段:

MONITOR_INFO_2 m_MonitorInfo2;
m_MonitorInfo2.pName = lpMonitorName;
TCHAR env[12] = TEXT("Windows x64");
m_MonitorInfo2.pEnvironment = env;
m_MonitorInfo2.pDLLName     = lpDllName;


if ( !AddMonitor(NULL, 2, (LPBYTE) &m_MonitorInfo2) )
{
    DWORD error = GetLastError();
    std::cout << "Last error = " << error << "\n";
    return PRINTER_ERR_API;
}

当我作为管理员组的成员运行它时失败。GetLastError() 返回 5。当我以“管理员”身份运行它时,它成功且没有问题。我在 Windows 7 x64 上运行。我正在尝试安装 redmonnt.dll 并且我确实拥有该 dll 的 64 位版本。此任务是 PostScript 驱动程序更大安装的一部分。我只隔离了 AddMonitor 部分以消除其他外部问题。

错误 5 是访问冲突或安全问题。我的第一个问题是为什么管理员组的成员不能执行这个函数调用?在这种情况下,实际管理员和管理员组的成员之间有什么区别?

其他需要注意的细节。我正在为我的打印机安装使用 InstallShield 12(旧)(addmonitor 只是一部分)。我正在通过 win32 函数调用添加监视器、端口、驱动程序和打印机。在运行我的 AddPrinterMonitor.exe 之前,我确保 redmonnt.dll 确实存在于 system32 目录中。实际上,dll是否存在与我看到的错误没有区别。我确实看到了有关设置 SeLoadDriverPrivilege 的帖子。当我检查时,这对我来说是一个死胡同,管理员组可以加载/卸载设备驱动程序。

另外,我正在使用 win32 调用来完成这项工作。这在 Win2K、WinXP 和 Windows Server 2003 上有效(我的意思是所有这些都有效)没有任何问题。对于较新的操作系统,如 Windows 7,有几个困难。有没有更好的方法被我忽略了?我很沮丧试图让它工作,所以我开始质疑 Vista 和更高版本的方法。

更多初始化代码:

#define MONITOR_NAME            "My Redirected Port"
#define MONITOR_FILE            "redmonnt.dll"

MONITOR_NAME 被传递给 lpMonitorName 并且 MONITOR_FILE 被传递给 lpDllName

谢谢

4

0 回答 0