VB.NET如何设置默认打印机?共享打印机打印权限报错求助
VB.NET 修改默认打印机及打印问题解决
我来帮你搞定这个问题!你碰到的报错:
Setting to access printer "printer Name " are not valid.
大概率是直接指定共享打印机名称时,程序要么没拿到足够访问权限,要么打印机名称格式不对(比如没写完整的共享路径)。既然设为默认打印机就能正常打印,那修改默认打印机确实是个靠谱的解决方案,下面给你两种VB.NET里实现的方法:
方法一:调用Windows原生API修改
.NET类库没有直接提供修改默认打印机的方法,所以我们可以调用Windows的winspool.drv里的API来实现,步骤很简单:
首先在你的代码里添加API声明和工具类:
Imports System.Runtime.InteropServices Public Class PrinterHelper ' 声明Windows API函数 <DllImport("winspool.drv", CharSet:=CharSet.Auto, SetLastError:=True)> Private Shared Function SetDefaultPrinter(ByVal printerName As String) As Boolean End Function ' 对外暴露的修改默认打印机方法 Public Shared Function ChangeDefaultPrinter(printerName As String) As Boolean Return SetDefaultPrinter(printerName) End Function End Class
然后在需要修改打印机的地方调用这个方法,之后再执行打印:
' 替换成你的共享打印机完整路径,比如 "\\FileServer01\HP_OfficeJet" Dim targetPrinter As String = "\\你的服务器名\共享打印机名" If PrinterHelper.ChangeDefaultPrinter(targetPrinter) Then ' 修改成功,执行打印 print1.Print() Else ' 修改失败,提示用户检查 MessageBox.Show("无法设置默认打印机,请确认打印机名称正确或当前用户有权限修改") End If
方法二:用WMI(Windows管理规范)修改
如果你不想写API声明,可以用WMI来操作,不过需要先添加System.Management引用:
- 右键你的VB.NET项目 → 选择「添加引用」→ 找到
System.Management并勾选添加。 - 然后使用下面的代码:
Imports System.Management Public Sub SetDefaultPrinterWithWMI(printerName As String) ' 构造查询语句,注意转义单引号 Dim printerQuery As New ManagementObjectSearcher( "SELECT * FROM Win32_Printer WHERE Name = '" & printerName.Replace("'", "''") & "'" ) For Each printerObj As ManagementObject In printerQuery.Get() ' 调用SetDefaultPrinter方法 Dim resultCode As Object = printerObj.InvokeMethod("SetDefaultPrinter", Nothing) If CInt(resultCode) = 0 Then MessageBox.Show("默认打印机已成功设置") ' 执行打印 print1.Print() Else MessageBox.Show($"设置失败,错误码:{resultCode.ToString()}") End If Next End Sub
调用的时候直接传入完整的打印机共享名称即可:
SetDefaultPrinterWithWMI("\\你的服务器名\共享打印机名")
额外注意事项
- 打印机名称要完整:共享打印机必须写全路径,比如
\\服务器IP或名称\打印机共享名,只写打印机的本地名称会导致程序找不到设备。 - 权限问题:修改默认打印机需要当前用户有系统权限,如果是客户端程序,要确保运行程序的用户有权限修改打印机设置。
- 备选方案:如果你不想修改默认打印机,也可以尝试给程序添加共享打印机的访问凭据,或者检查打印机的共享权限是否开放给当前用户。
内容的提问来源于stack exchange,提问作者s-dept




