1

Windowsネットワーク(ピアツーピア)とAc​​tive Directoryがあり、サーバーにあらゆる種類の印刷物を送信するユーザーの名前をログに記録する必要があります。ユーザー名やそれぞれのIPをログに記録するプログラムを作成したいのですが、c#.netとc ++に精通していますが、問題を解決する方法についての手がかりが見つかりません。

WMIの助けを借りて彼らの名前をキャッチする方法はありますか、それともAPIで手を汚す必要がありますか(しかし、どのAPIがわかりません)?

よろしく。

4

4 に答える 4

1

私は過去にこれを使用しましたが、必要なものがすべて揃っていない場合は、少なくとも印刷キューの監視を行う必要があります。

http://www.merrioncomputing.com
http://www.merrioncomputing.com/Download/PrintQueueWatch/PrinterQueueWatchLicensing.htm

ソースコードリンク(OPのコメントから): http:
//www.codeproject.com/KB/printing/printwatchvbnet.aspx

于 2010-01-15T19:52:39.223 に答える
1

これらの機能は、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句を使用して、必要に応じてフィルタリングできます。

于 2010-01-15T19:53:40.317 に答える
1

WMIを使用します。これにより、システムに関連付けられているプリンターのプリンターバッチを照会したり、サポートされているすべてのプロパティをプルしたりすることができます。それは簡単です...

System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_PrintJob");

... WMIオブジェクトサーチャーを作成し、結果を列挙します。

次に例を示します。

WMIクエリプリンター

于 2010-01-15T19:57:25.860 に答える
0

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 ;
}
于 2012-10-16T05:12:04.717 に答える