3

AddMonitor を呼び出すだけの非常に小さな win32 コンソール アプリケーション (AddPrintMonitor.exe) を作成しました。ここに小さなスニペットがあります:

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 などの新しい OS では、いくつかの問題があります。私が見落としていたより良い方法はありますか?これを機能させようとして非常にイライラしていたので、Vista 以降のアプローチに疑問を持ち始めました。

その他の初期化コード:

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

MONITOR_NAME は lpMonitorName に渡され、MONITOR_FILE は lpDllName に渡されます。

ありがとう

4

0 に答える 0