Hello! I'm new here, so please be gentle. I'm working on a small program to map network printers for an enterprise I work for. My ability to access the printers is limited to standard user permissions and I can make no changes to the network whatsoever.
I got this working fairly easily using PowerShell's Get-Printer and Add-Printer cmdlets, but when I attempted to use the same commands in C# I discovered that those two cmdlets do not seem to be included in the System.Management.Automation library. The PowerShell code I am attempting to adapt is below:
Function mapPrinter () { try { $title = "Printer Mapping Status" $message = "Printer successfully mapped! Please allow some time for printer to appear as an option." if ($PrinterListBox.SelectedItems.Count -gt 0) { foreach ($printer in $PrinterListBox.SelectedItems) { $printerPath = "\\" + $printer.SERVER + "\" + $printer.PRINTER Add-Printer -ConnectionName $printerPath -ErrorAction Stop } displayMessage -msg $message -ttl $title $PrinterMapButton.IsEnabled = $false } } catch { $message = "" $title = "Printer Mapping Error" displayMessage -msg $message -ttl $title } }
I attempted to import the PrintManagement module into the runspace of the PowerShell instance, but every attempt I made failed. The latest attempt is below:
private void mapPrinter(object sender, RoutedEventArgs e) { if (PrinterListBox.SelectedItems.Count > 0) { foreach (PrinterObject printer in PrinterListBox.SelectedItems) { InitialSessionState iss = InitialSessionState.CreateDefault(); iss.ImportPSModule("PrintManagement"); using (Runspace runSpace = RunspaceFactory.CreateRunspace(iss)) { runSpace.Open(); using (var pipeline = runSpace.CreatePipeline()) { string printerPath = "\\\\" + printer.Server + "\\" + printer.Printer; var parameters = new Dictionary<string, object> { {"ComputerName", printer.Server}, {"ConnectionName", printerPath}, {"ErrorAction", "Stop"} }; Command cmd = new Command("Add-Printer"); cmd.Parameters.Add("ComputerName", printer.Server); cmd.Parameters.Add("ConnectionName", printerPath); cmd.Parameters.Add("ErrorAction", "Stop"); pipeline.Commands.Add(cmd); pipeline.Invoke(); } } } } }
I have also attempted to use CimSession for this purpose. In that case, I managed to get the mapping functionality working, but when attempting to do connection validation it has thus far failed. I can't assume the paths fed to the program are valid, so I need to be able to test them prior to presenting them to users as an option. The "easiest" way to do this is the Add- and Get-Printer cmdlets, but they have thus far proven to be very far from easy.
My question / request is this: how the devil do you get Add- and Get-Printer working in C#?