如何使用 cmd.exe 或 PowerShell 检查 C:\ProgramData 和子容器中是否存在这些 https://bugzilla.mozilla.org/show_bug.cgi?id=1841751#c4 .DLL 文件?
最好是单行而不是脚本。
无需更改任何文件或文件夹的访问权限。 (使用资源管理器时我必须更改权限)。
考虑使用 Get-Childitem,但是:-
获取当前目录及所有子目录下DLL文件的文件版本和程序集版本
说项目保持加载状态并且无法删除“不幸的是它加载文件并且永远不会释放它们”。除非使用代码,否则我无法理解生成新的 PowerShell 实例。没有尝试过这个,因为我不确定到底要做什么,或者它是否会做一些不可逆转的事情。
甚至不确定这是否会显示 DLL 的属性而无需更改权限。
是否有其他方法可以避免需要新的 Powershell 实例?
从根本上来说,隐藏系统目录
C:\ProgramData
($env:ProgramData
或$env:ALLUSERSPROFILE
)的子目录属于以下3类之一:
(a) 有些内容任何人都可以阅读。
(b) 有些受到保护,不被“非提升”进程读取(无需管理权限运行)。
以交互方式
(ACL): 文件资源管理器允许通过 UAC 对话框在访问受影响的文件夹时执行此更改(这意味着如果当前用户是管理员,只需确认
对话框就足够了;否则,需要管理员凭据)。:[1] 也就是说,您必须确保您的
Get-ChildItem
调用是从提升的
PowerShell 会话进行的(适用与上述 UAC 对话框相同的要求):交互式
Run as Administrator
,确认 UAC 对话框,然后运行 Get-ChildItem
/
Test-Path
命令。
以编程方式提升的 PowerShell 会话: 使用
Start-Process
-Verb RunAs (Get-Process -Id $PID).Path
启动交互式提升会话,然后在该新会话中提交命令。如果您想要启动提升的会话并提交命令在单个操作中
Start-Process -Verb RunAs (Get-Process -Id $PID).Path @'
-NoExit -Command
Get-ChildItem -ErrorAction SilentlyContinue -ErrorVariable err -Recurse -Force -Filter *.dll -LiteralPath C:\ProgramData |
ForEach-Object VersionInfo |
Where-Object FileVersion -in '1.0.0.26638', '1.0.0.26793', '1.0.0.27567', '1.0.0.29915', '1.0.0.31122'
if ($err) {
if ($notFound = $err.Where({ $_.Exception -is [System.Management.Automation.ItemNotFoundException] }).TargetObject) {
Write-Warning "The following paths were not found: `n $($notFound -join "`n ")"
}
if ($notAuthorized = $err.Where({ $_.Exception -is [System.UnauthorizedAccessException] }).TargetObject) {
Write-Warning "You are not authorized to access the following paths:`n $($notAuthorized -join "`n ")"
}
}
'@.Replace('"', '\"')
上面是一个
示例查找恶意软件DLL,这可能会产生误报。 正如
链接的错误报告我假设
Timestamp
.LastWriteTime
System.IO.FileInfo
实例的
Get-ChildItem
属性。
CheckSum
(在错误报告中它是通过WinDbg获取的)。
C:\ProgramData
(例如与
-Recurse
结合使用),则必须也使用
-Force
,否则PowerShell将找不到该目录,因为它是隐藏的。
可以想象,有一种方法可以通过模拟或临时修改与当前进程关联的用户令牌的权限,但我不确定。