小编Mak*_*Sim的帖子

powershell cmdlet 的枚举参数

我正在 powershell 上编写一个 cmdlet(脚本),我想使用 eunm 作为参数之一。但我不知道将枚举定义放在哪里,以便它对 cmdlet 参数声明可见。

例如,我有一个像这样的脚本的参数定义

[cmdletbinding()]
param(
    [Parameter(Mandatory=$True)]
    [string]$Level
)
Run Code Online (Sandbox Code Playgroud)

和这样的枚举

enum LevelEnum { NC = 1; NML = 2; CS = 3 }
Run Code Online (Sandbox Code Playgroud)

我无法替换参数定义中的[string]with [LevelEnum],因为脚本将无法找到枚举定义。而且我之前不能放定义cmdletbinding,这是不允许的。如果那是一个函数,我知道该怎么做,我知道它可以使用 解决ValidateSet,但我需要有与枚举选项相关的整数值。

[ValidateSet('NC','NML','CS')]
Run Code Online (Sandbox Code Playgroud)

但问题是,我可以对 cmdlet 做同样的事情吗?


谢谢大家。我最终得到了不同答案的组合。

[cmdletbinding()]
param(
    [Parameter(Mandatory=$True)]
    [ValidateSet('NC','NML','CS')]
    [string]$Level
)
# Convert level from string to enum
enum PatchLevel { NC = 1; NML = 2; CS = 3 }
[PatchLevel]$l = $Level

# Use the numeric value
Write-Host $l.value__
Run Code Online (Sandbox Code Playgroud)

powershell cmdlets cmdlet

6
推荐指数
2
解决办法
1221
查看次数

WinSpool OpenPrinter访问被拒绝

这是第335次被问到此问题,但我没有找到答案。我正在尝试通过WinSpool API从ASP.net C#应用程序直接将原始数据发送到打印机。

我的代码只是这里的副本

错误在这里

if( OpenPrinter( szPrinterName.Normalize(), out hPrinter, IntPtr.Zero ) )
Run Code Online (Sandbox Code Playgroud)

它对于本地打印机工作正常,但对于共享网络打印机,OpenPrinterGetLastError实际结果)始终为5 - Access Denied

我试过了

  • PRINTER_DEFAULTS具有不同组合的不同值DesiredAccess
  • 向用户授予管理员特权
  • 像这样设置打印机

我必须注意,我只想打印,而不是更改打印机配置或需要管理权限的内容。

我可以使用“打印机选项”页面和其中嵌入的测试工具从服务器打印到此共享打印机。这样打印机即可工作。如何通过API访问它?


更新:如果从Windows应用程序或控制台应用程序中调用,此代码看起来工作正常。那么为什么在Web应用程序中拒绝访问?


更新2:问题可能是由于以下事实引起的:安装在主机PC上并与虚拟PC共享的打印机(或在生产环境中:打印机安装在域内并共享到DMZ中的PC),并且没有正确的方法授予该打印机权限虚拟PC的用户(或域外的用户)


更新3:这是另一个事实。如果我从资源管理器中的虚拟设备浏览到主机PC(例如\\host_pc\C$),则会收到输入用户名和密码以访问主机PC的通知。如果在此之后选中“保存密码”,整个“访问被拒绝”问题将消失,直到我在主机PC上更改密码为止。

c# vb.net printing asp.net winapi

5
推荐指数
1
解决办法
2332
查看次数

标签 统计

asp.net ×1

c# ×1

cmdlet ×1

cmdlets ×1

powershell ×1

printing ×1

vb.net ×1

winapi ×1