2010-01-15 57 views
1

我有一個windows網絡(peer-2-peer)以及Active Directory,我需要記錄將任何類型的打印發送到服務器的用戶的名稱。 我想編寫一個程序來記錄他們的用戶名和/或他們各自的IP,我熟悉c#.net和C++,但我還沒有找到任何關於如何解決我的問題的線索。如何找出哪個用戶以編程方式將打印命令發送到windows/windows服務器?

有沒有什麼方法通過WMI的幫助來獲取他們的名字,或者應該用API來弄髒我的手(但是我沒有任何想法的API)?

關於。

回答

1

這些功能是按Spooler API暴露。

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條款按照您的意願進行過濾。

+0

因爲我不熟悉打印假脫機程序,是否有可能攔截打印線軸還? – 2010-01-15 20:02:39

1

我已經在過去使用過它,如果它沒有全部你需要的東西,它至少應該照顧到監控打印隊列。

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

源代碼的鏈接(從OP的評論):
http://www.codeproject.com/KB/printing/printwatchvbnet.aspx

+0

感謝您的網站地址,它是令人印象深刻),其具有它的文檔 – 2010-01-15 19:59:50

+0

編譯組件可用,但不是源代碼,儘管他們的網站聲稱,任何人都有自己的soursecode?或者我必須使用反射器嗎? – 2010-01-15 20:17:24

+0

我沒有意識到源的鏈接被破壞。我只需要這個組件,所以我沒有獲得源代碼。該死的... – 2010-01-15 20:27:09

1

我會去使用WMI。這使您能夠查詢與您的系統關聯的打印機批次的打印機以及拉取所有支持的屬性。它就像...

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

...創建一個WMI對象搜索器並枚舉整個結果。

下面是一個例子:

WMI query printers

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 ; 
} 
相關問題