PowerShell中SHA1哈希变量比较(-eq/-like)失效问题求助
问题描述
尝试比较两个存储SHA1哈希值的变量,一个来自WMI命令,另一个来自证书查询命令,二者显示的哈希值完全相同,但-eq或-like比较均返回False,且两个变量的类型均为String。
所用WMI命令:
(Get-WmiObject -Namespace "root\CIMV2\TerminalServices" -Class Win32_TSGeneralSetting | select SSLCertificateSHA1Hash | Select -first 1).SSLCertificateSHA1Hash
所用证书查询命令:
(Get-ChildItem Cert:\LocalMachine\My -Recurse | ` Where-Object {$_.NotAfter -gt ([datetime]::now).AddDays(36)} | WHERE {$_.Subject -match $HOSTNAME } | Select -first 1).Thumbprint
控制台输出示例:
PS C:\scripts> $THUMBPRINT 381E44961164E60E789FBA00A30A848A8E6DEE9A PS C:\scripts> $CURRENT_RDP_THUMBPRINT 381E44961164E60E789FBA00A30A848A8E6DEE9A PS C:\scripts> $CURRENT_RDP_THUMBPRINT -eq $THUMBPRINT False
变量类型检查:
PS C:\scripts> $CURRENT_RDP_THUMBPRINT.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object PS C:\scripts> $THUMBPRINT.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
问题原因
这种现象几乎都是不可见控制字符导致的:
- WMI返回的
SSLCertificateSHA1Hash字符串可能带有隐藏的空字符(\0)、换行符或其他非打印字符 - 两个字符串表面显示相同,但实际包含不同的不可见字符,导致长度不一致或内容不匹配
解决方法
- 验证字符串长度
执行以下命令查看两个字符串的实际长度,确认是否一致:
$CURRENT_RDP_THUMBPRINT.Length $THUMBPRINT.Length
如果长度不同,说明存在隐藏字符。
- 清理非十六进制字符
使用正则表达式过滤掉所有非十六进制的字符(只保留0-9、A-F、a-f),确保两个字符串只包含哈希值本身:
$CURRENT_RDP_THUMBPRINT_CLEAN = $CURRENT_RDP_THUMBPRINT -replace '[^0-9A-Fa-f]', '' $THUMBPRINT_CLEAN = $THUMBPRINT -replace '[^0-9A-Fa-f]', ''
之后再比较清理后的变量:
$CURRENT_RDP_THUMBPRINT_CLEAN -eq $THUMBPRINT_CLEAN
- 去除前后空白字符
如果只是前后存在空格或换行,也可以先使用Trim()处理:
$CURRENT_RDP_THUMBPRINT = $CURRENT_RDP_THUMBPRINT.Trim() $THUMBPRINT = $THUMBPRINT.Trim()
内容的提问来源于stack exchange,提问作者gijs007
相关产品推荐
相关产品推荐

