2010-01-15 10 views
1

J'ai un réseau Windows (peer-2-peer) ainsi que Active Directory et j'ai besoin d'enregistrer le nom des utilisateurs qui envoient n'importe quel type d'impression sur le serveur. Je veux écrire un programme pour enregistrer leur nom d'utilisateur et/ou leur adresse IP respective et je suis familier avec C# .net et C++ mais je n'ai pas trouvé la moindre idée de la façon de résoudre mon problème.Comment puis-je savoir quel utilisateur envoie la commande d'impression au serveur Windows/Windows par programme?

Y at-il une sorte de moyen d'attraper leur nom à l'aide de WMI ou devrait me salir la main avec des API (mais quelle API je n'ai aucune idée)?

ce qui concerne.

Répondre

1

Ces caractéristiques sont exposées sous la Spooler API.

EnumJobs va énumérer tous les travaux en cours pour une imprimante donnée. Il renvoie une struct JOB_INFO_1, qui comprend le nom d'utilisateur associé à un travail d'impression donné:

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; 

Si vous préférez WMI, vous pouvez utiliser wmic.exe avec le commutateur /node (ou votre variante préférée) et la classe Win32_PrintJob . Approximativement:

c:\> wmic /node 10.0.0.1 
wmic> SELECT * FROM Win32_PrintJob 

... renverra une structure avec toutes les informations de travail d'impression pour le serveur sélectionné. Vous pouvez filtrer comme vous le souhaitez avec la clause WHERE.

+0

puisque je ne suis pas familier avec le spouleur d'impression, est-il possible intercepter la bobine d'impression aussi? –

1

Je l'ai utilisé par le passé et s'il ne possède pas tout ce dont vous avez besoin, il devrait au moins prendre soin de surveiller les files d'attente d'impression.

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

lien code source (du commentaire de l'OP):
http://www.codeproject.com/KB/printing/printwatchvbnet.aspx

+0

merci pour l'adresse du site, il était impressionnant;) –

+0

composant compilé avec sa documentation est disponible mais pas avec le code source, en dépit de la réclamation dans leur site Web, tout le monde a son soursecode? ou Dois-je utiliser un réflecteur? –

+0

Je n'ai pas réalisé que le lien vers la source était cassé. J'avais juste besoin du composant, donc je n'ai pas eu la source. Merde ... –

1

Je voudrais aller avec WMI. Cela vous donne la possibilité d'interroger des lots d'imprimantes associés à votre système ainsi que de tirer toutes les propriétés de support. C'est aussi simple que ...

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

... créer un chercheur d'objet WMI et d'énumérer les résultats.

Voici un exemple:

WMI query printers

0

Découvrez quel utilisateur a envoyé travail d'impression en C++ sous Windows.

#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 ; 
}