Windowsネットワーク(ピアツーピア)とActive Directoryがあり、サーバーにあらゆる種類の印刷物を送信するユーザーの名前をログに記録する必要があります。ユーザー名やそれぞれのIPをログに記録するプログラムを作成したいのですが、c#.netとc ++に精通していますが、問題を解決する方法についての手がかりが見つかりません。
WMIの助けを借りて彼らの名前をキャッチする方法はありますか、それともAPIで手を汚す必要がありますか(しかし、どのAPIがわかりません)?
よろしく。
私は過去にこれを使用しましたが、必要なものがすべて揃っていない場合は、少なくとも印刷キューの監視を行う必要があります。
http://www.merrioncomputing.com
http://www.merrioncomputing.com/Download/PrintQueueWatch/PrinterQueueWatchLicensing.htm
ソースコードリンク(OPのコメントから): http:
//www.codeproject.com/KB/printing/printwatchvbnet.aspx
これらの機能は、SpoolerAPIで公開されています。
EnumJobs特定のプリンタの現在のすべてのジョブを列挙します。JOB_INFO_1指定された印刷ジョブに関連付けられたユーザー名を含む構造体を返します。
typedef struct _JOB_INFO_1 {
DWORD JobId;
LPTSTR pPrinterName;
LPTSTR pMachineName;
LPTSTR pUserName;
LPTSTR pDocument;
LPTSTR pDatatype;
LPTSTR pStatus;
DWORD Status;
DWORD Priority;
DWORD Position;
DWORD TotalPages;
DWORD PagesPrinted;
SYSTEMTIME Submitted;
}JOB_INFO_1, *PJOB_INFO_1;
WMIを使用する場合wmic.exeは、/nodeスイッチ(または任意のバリエーション)とWin32_PrintJobクラスで使用できます。だいたい:
c:\> wmic /node 10.0.0.1
wmic> SELECT * FROM Win32_PrintJob
...選択したサーバーのすべての印刷ジョブ情報を含む構造体を返します。WHERE句を使用して、必要に応じてフィルタリングできます。
WMIを使用します。これにより、システムに関連付けられているプリンターのプリンターバッチを照会したり、サポートされているすべてのプロパティをプルしたりすることができます。それは簡単です...
System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_PrintJob");
... WMIオブジェクトサーチャーを作成し、結果を列挙します。
次に例を示します。
WindowsでC++を使用して印刷ジョブを送信したユーザーを確認します。
#include <WinSpool.h>
wstring GetUserNameFromPrintJob(wstring m_strFriendlyName)
{
wstring strDocName = L"";
wstring strMachineName = L"";
wstring strUserName = L"";
HANDLE hPrinter ;
if ( OpenPrinter(const_cast<LPWSTR>(m_strFriendlyName.c_str()), &hPrinter, NULL) == 0 )
{
/*OpenPrinter call failed*/
}
DWORD dwBufsize = 0;
PRINTER_INFO_2* pinfo = 0;
GetPrinter(hPrinter, 2,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize
PRINTER_INFO_2* pinfo2 = (PRINTER_INFO_2*)malloc(dwBufsize); //Allocate with dwBufsize
GetPrinter(hPrinter, 2,(LPBYTE)pinfo2, dwBufsize, &dwBufsize);
DWORD numJobs = pinfo2->cJobs;
free(pinfo2);
JOB_INFO_1 *pJobInfo = 0;
DWORD bytesNeeded = 0, jobsReturned = 0;
//Get info about jobs in queue.
EnumJobs(hPrinter, 0, numJobs, 1, (LPBYTE)pJobInfo, 0,&bytesNeeded,&jobsReturned);
pJobInfo = (JOB_INFO_1*) malloc(bytesNeeded);
EnumJobs(hPrinter, 0, numJobs, 1, (LPBYTE)pJobInfo, bytesNeeded, &bytesNeeded, &jobsReturned);
JOB_INFO_1 *pJobInfoInitial = pJobInfo;
for(unsigned short count = 0; count < jobsReturned; count++)
{
if (pJobInfo != NULL)
{
strUserName = pJobInfo->pUserName //username
strMachineName = pJobInfo->pMachineName; //machine name
strDocName = pJobInfo->pDocument; // Document name
DWORD dw = pJobInfo->Status;
}
pJobInfo++;
}
free(pJobInfoInitial);
ClosePrinter( hPrinter );
return strUserName ;
}