如何使用 cmd.exe 或 PowerShell 检查 .DLL 文件是否存在,而不更改权限? [已关闭]

问题描述 投票:0回答:1

如何使用 cmd.exe 或 PowerShell 检查 C:\ProgramData 和子容器中是否存在这些 https://bugzilla.mozilla.org/show_bug.cgi?id=1841751#c4 .DLL 文件?

最好是单行而不是脚本。

无需更改任何文件或文件夹的访问权限。 (使用资源管理器时我必须更改权限)。

考虑使用 Get-Childitem,但是:- 获取当前目录及所有子目录下DLL文件的文件版本和程序集版本 说项目保持加载状态并且无法删除“不幸的是它加载文件并且永远不会释放它们”。除非使用代码,否则我无法理解生成新的 PowerShell 实例。没有尝试过这个,因为我不确定到底要做什么,或者它是否会做一些不可逆转的事情。 甚至不确定这是否会显示 DLL 的属性而无需更改权限。
是否有其他方法可以避免需要新的 Powershell 实例?

powershell cmd dll attributes get-childitem
1个回答
0
投票

从根本上来说,隐藏系统目录

C:\ProgramData
$env:ProgramData
$env:ALLUSERSPROFILE
)的子目录属于以下3类之一:

  • (a) 有些内容任何人都可以阅读。

  • (b) 有些受到保护,不被“非提升”进程读取(无需管理权限运行)。

  • (c) 有些甚至受到保护,不被“提升”进程读取其内容。
  • 以交互方式
  • ,对于 (b) 和 (c) 中的目录,当前用户可以通过文件资源管理器中的一次性操作持续获得访问权限,从而
更改文件系统权限

(ACL): 文件资源管理器允许通过 UAC 对话框在访问受影响的文件夹时执行此更改(这意味着如果当前用户是管理员,只需确认

对话框就足够了;否则,需要管理员凭据)。
  • 以编程方式
  • (对于尚未以交互方式“解锁”的目录),您只能临时访问类别 (b)
,无需更改权限

[1] 也就是说,您必须确保您的

    Get-ChildItem
  • 调用是从提升的

     PowerShell 会话进行的(适用与上述 UAC 对话框相同的要求):

    交互式
  • ,右键单击 PowerShell 任务栏/开始菜单图标,选择
  • 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,这可能会产生误报。 正如

    链接的错误报告
  • 所述,恶意软件 DLL 的路径和特定文件名可能会有所不同,因此按路径/名称搜索将不起作用。
  • 为了进一步缩小匹配范围,您需要对命令进行两次调整,以根据

    此评论
  • 查找以下内容:
  • 这四项信息的组合(Timestamp、CheckSum=0、ImageSize、File version)

我假设
Timestamp
    对应于
  • .LastWriteTime

     发出的 
    System.IO.FileInfo
     实例的 
    Get-ChildItem
    属性。
    
    

  • 我不清楚如何在PowerShell中获取
  • CheckSum

    (在错误报告中它是通过WinDbg获取的)。

    
    

  • 一般而言,如果您直接定位
  • C:\ProgramData

    (例如与

    -Recurse
    结合使用),则
    必须
    也使用-Force,否则PowerShell将找不到该目录,因为它是隐藏的。
    
    


[1]

可以想象,有一种方法可以通过模拟或临时修改与当前进程关联的用户令牌的权限,但我不确定。

© www.soinside.com 2019 - 2024. All rights reserved.