如何在PowerShell的Try/Catch块中捕获无法翻译的SID值?
解决PowerShell中无法显示未翻译SID的问题
你可以通过在catch块中保留当前处理的SID来显示无法翻译的条目,不需要依赖$_.Exception.TargetObject(这个属性在这里确实为空)。只需要在循环时先把SID存到变量里,捕获异常时直接输出该变量即可。
修改后的脚本如下:
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent() | Select-Object Name, @{n='Groups';e={ $_.Groups | Foreach-Object { # 先保存当前SID,避免异常后无法获取 $currentSid = $_.Value try { # 成功翻译时,输出名称+SID "$($_.Translate([System.Security.Principal.NTAccount]).Value) ($currentSid)" } catch { # 翻译失败时,明确提示并输出SID "无法翻译的SID: $currentSid" } } }} | ConvertTo-Html -As List -Fragment
关键改动说明
- 在循环每个组对象时,先将SID存入
$currentSid变量,确保即使Translate抛出异常,也能访问到对应的SID。 - 移除
Out-Null,改为在catch中返回包含SID的提示文本,这样生成的HTML片段会显示出所有组,包括无法翻译的SID条目。
关于用if/else替代try/catch:实际上没有直接的API可以提前判断一个SID是否能被翻译成NTAccount,所以try/catch是最简洁高效的处理方式。如果非要用条件判断,本质还是需要尝试翻译并捕获结果,反而不如直接用try/catch清晰。
内容的提问来源于stack exchange,提问作者Qwerty
相关产品推荐
相关产品推荐

