2010-05-21 4 views
1

Dans notre code, nous devons donner aux utilisateurs une liste d'imprimantes à choisir. L'utilisateur choisit alors une imprimante et vérifie qu'elle est valide avant l'impression. Sur un serveur Windows 2003 avec IIS 6, cela fonctionne très bien. Sur un serveur Windows 2008 avec IIS 7, il échoue chaque fois que impersonate est défini sur true.PrinterSettings.IsValid retourne toujours false

PrinterSettings printerSetting = new PrinterSettings(); 
printerSetting.PrinterName = ddlPrinterName.SelectedItem.Text; 
if (!printerSetting.IsValid) 
{ 
    lblMsg.Text = "Server Printer is not valid."; 
} 
else 
{ 
    lblMsg.Text = "Success"; 
} 

Chaque fois que ce code est exécuté, l'affiche « Printer Server n'est pas valide », seulement si usurper l'identité est définie sur true. Si l'option impersonate est définie sur false, le message de réussite s'affiche.

L'utilisateur d'emprunt d'identité a tous les droits sur l'imprimante.

Existe-t-il un moyen d'identifier la raison réelle pour laquelle l'imprimante n'est pas valide? Y a-t-il d'autres paramètres que je devrais vérifier en 2008? J'ai trouvé que IsValid échoue lorsque les pools d'applications IIS7 ont "Activer les applications 32 bits" est vérifiée. Cela doit être vérifié b/c nous utilisons un outil tiers pour imprimer avec, et il s'agit d'une application 32 bits. Il ne fait actuellement pas partie de ce test, donc maintenant il ne cause pas cette erreur.

+0

à la place de lblMsg.Text = "L'imprimante serveur n'est pas valide"; J'ai ajouté System.Drawing.Printing.InvalidPrinterException jorInvalidEx = new InvalidPrinterException (printerSetting); lblMsg.Text = jorInvalidEx.Message; Le message "Paramètres d'accès à l'imprimante" "ne s'affiche pas." – Jarrod

Répondre

0

IIS 7.0 est vraiment verrouillé. Il semble que le serveur n'emprunte pas correctement l'identité. Les profils d'imprimante sont stockés dans la ruche HK_CURRENT_USER de l'utilisateur ou s'il s'agit d'une imprimante connectée localement dans HK_LOCAL_MACHINE.

Je voudrais utiliser PROCMON de SYSINTERNALS pour voir les appels que le processus IIS est en train de faire.

0

Vous pouvez essayer en interrogeant le système à l'aide de WMI. Une façon de achive cela peut être le suivant:

using System.Management; 

    private List<string> GetPrinters() 
    {  
    List<string> printerNames = new List<string>(); 

    System.Management.ObjectQuery oquery = 
     new System.Management.ObjectQuery("SELECT * FROM Win32_Printer"); 

    System.Management.ManagementObjectSearcher mosearcher = 
     new System.Management.ManagementObjectSearcher(oquery); 

    System.Management.ManagementObjectCollection moc = mosearcher.Get(); 

    foreach (ManagementObject mo in moc) 
    { 
     System.Management.PropertyDataCollection pdc = mo.Properties; 
     foreach (System.Management.PropertyData pd in pdc) 
     { 
      if ((bool)mo["Network"]) 
      { 
       printerNames.Add(mo[pd.Name]); 
      } 
     } 
    } 

    return printerNames; 
} 

Après cela, d'une manière similaire, vous pouvez trouver d'autres informations de l'imprimante comme si l'imprimante est prête. Plus ici: https://stackoverflow.com/a/1622931/2791580

Cordialement

0

Applications Piscine avancée Réglage Modèle de processus changer d'identité aux administrateurs de l'utilisateur

oPD.PrinterSettings.PrinterName = \\10.10.1.1\myprintertnetwork; 
0

J'ai eu exactement le même problème, et j'ai pu pour le résoudre en quittant temporairement le contexte d'emprunt d'identité. En adaptant votre exemple, le code suivant:

PrinterSettings printerSetting = new PrinterSettings(); 
printerSetting.PrinterName = ddlPrinterName.SelectedItem.Text; 

using (var wic = WindowsIdentity.Impersonate(IntPtr.Zero)) 
{ 
    if (!printerSetting.IsValid) 
    { 
     lblMsg.Text = "Server Printer is not valid."; 
    } 
    else 
    { 
     lblMsg.Text = "Success"; 
    } 

    // Do the remainder of your printing stuff here, but beware that 
    // your user context is different. 
} 

devrait donner le message de succès. (Le crédit pour cette solution passe à Jon Saffron.)

Questions connexes