在我的工作中列出每个用户的所有网络打印机

问题描述:

,我们在每个用户的基础上安装打印机。我正在尝试编写一个备份程序,列出给定用户名的所有联网打印机。这是否可能?通过WMI或System.IO即可。以下是列出所有机器联网打印机但不是每个用户的代码。在我的工作中列出每个用户的所有网络打印机

private void Button_Click(object sender, EventArgs e) 
{ 
     ConnectionOptions objConnection = new ConnectionOptions(); 

     objConnection.Impersonation = ImpersonationLevel.Impersonate; 

     objConnection.EnablePrivileges = true; 



     string backupselectedcomputer = "Some Computer Name" 

      ManagementScope objScope = new ManagementScope("\\\\" + backupselectedcomputer  +"\\root\\cimv2",objConnection); 
     objScope.Connect(); 

     SelectQuery selectQuery = new SelectQuery(); 
     selectQuery.QueryString = "Select * from win32_Printer Where Local = FALSE"; 
     ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery); 
     ManagementObjectCollection MOC = MOS.Get(); 

     foreach (ManagementObject mo in MOC) 

     { 

     //lbBackupprinters is a list box 
      lbBackupprinters.Items.Add(mo["Name"].ToString().ToUpper()); 
     } 

} 
+0

我编辑了您的标题。请参见“[应的问题包括‘标签’,在他们的头衔?(http://meta.stackexchange.com/questions/19190/)”,这里的共识是“不,他们不应该”。 – 2013-04-04 19:08:56

+0

如果它是为每个用户分配的,则必须在活动目录中添加打印机,尝试在那里找到... – Arshad 2013-04-05 08:18:24

+0

http://*.com/questions/10468139/how-to-programmatically-search-a-printer- in-active-directory – Arshad 2013-04-05 08:19:04

想通了。以下是遇到此问题的任何人的代码。

private void ddlBackupselectuser_SelectionChangeCommitted(object sender, EventArgs e) 
    { 

     lbBackupprinters.Items.Clear(); 

     string selecteduser = ddlBackupselectuser.Text; 

     string computer = ddlBackupselectcomp.Text; 

     string sid; 

     lblBackuppwd.Visible = true; 
     txtBackuppwd.Visible = true; 
     cboBackuppwdshow.Visible = true; 

     //BEGIN GRAB PRINTERS FROM REGISTRY 

     try 
     { 
      NTAccount ntuser = new NTAccount(selecteduser); 
      SecurityIdentifier sID = (SecurityIdentifier)ntuser.Translate(typeof(SecurityIdentifier)); 
      lblBackupStatus.Text = sID.ToString(); 
      sid = sID.ToString(); 
     } 

     catch (IdentityNotMappedException) 
      { 
       lblBackupStatus.Text = "ERROR "+ ddlBackupselectuser.Text.ToString() + " contains no profile information"; 

       lbBackupprinters.Items.Add("No Printers Found"); 

      return; 

      } 



       ConnectionOptions co = new ConnectionOptions(); 
       co.EnablePrivileges = true; 
       co.Impersonation = ImpersonationLevel.Impersonate; 

       System.Net.IPHostEntry h = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); 
       string IPAddress = h.AddressList.GetValue(0).ToString(); 
       string lm = System.Net.Dns.GetHostName().ToString(); 

       try 
       { 


        ManagementScope myScope = new ManagementScope("\\\\" + computer + "\\root\\default", co); 
        ManagementPath mypath = new ManagementPath("StdRegProv"); 
        ManagementClass wmiRegistry = new ManagementClass(myScope, mypath, null); 


        const uint HKEY_LOCAL_MACHINE = unchecked((uint)0x80000002); 
        //ManagementClass wmiRegistry = new ManagementClass("root/default", 
        //"StdRegProv",null); 

        string keyPath = @"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Providers\\Client Side Rendering Print Provider\\" + sid + "\\Printers\\Connections"; 
        object[] methodArgs = new object[] { HKEY_LOCAL_MACHINE, keyPath, null }; 
        uint returnValue = (uint)wmiRegistry.InvokeMethod("EnumKey", methodArgs); 


        if (null != methodArgs[2]) 
        { 
         string[] subKeys = methodArgs[2] as String[]; 

         if (subKeys == null) 
         { 
          lbBackupprinters.Items.Add("No Printers Found"); 
          return; 
         } 

         ManagementBaseObject inParam = wmiRegistry.GetMethodParameters("GetStringValue"); 
         inParam["hDefKey"] = HKEY_LOCAL_MACHINE; 


         string keyName = ""; 


         foreach (string subKey in subKeys) 
         { 
          //Display application name 
          keyPath = @"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Providers\\Client Side Rendering Print Provider\\" + sid + "\\Printers\\Connections" + subKey; 
          keyName = "DisplayName"; 
          inParam["sSubKeyName"] = keyPath; 
          inParam["sValueName"] = keyName; 
          ManagementBaseObject outParam = wmiRegistry.InvokeMethod("GetStringValue", inParam, null); 



           lbBackupprinters.Items.Add(subKey); 


         } 
        } 

        else 
        { 

         lbBackupprinters.Items.Add("No Printers Found");        

        } 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show("Error: " + ex.Message); 
       } 
+0

哇,这工程!它使我可以访问打印机列表,甚至从服务器! – 2014-12-15 22:23:22