首页 > 系统相关 >PowerShell 可以帮助你获取挂载映像的服务列表

PowerShell 可以帮助你获取挂载映像的服务列表

时间:2024-02-05 16:46:51浏览次数:30  
标签:服务 Windows 映像 API 注册表 挂载 PowerShell

PowerShell 可以帮助你获取挂载映像的服务列表。这可以通过使用 Windows 的 Deployment Image Servicing and Management (DISM) 工具来完成,DISM 工具是一个命令行工具,它允许你服务 Windows 映像,包括那些用于 Windows PE、Windows Recovery Environment (Windows RE) 和 Windows Setup 的映像。

在 PowerShell 中使用 DISM 获取挂载映像的服务列表,你可以遵循以下步骤:

  1. 打开 PowerShell:首先,以管理员权限打开 PowerShell。这通常需要在开始菜单中找到 PowerShell,右键点击,然后选择“以管理员身份运行”。

  2. 挂载映像:如果你的映像尚未挂载,你需要先挂载它。可以使用 Mount-WindowsImage cmdlet 来挂载 WIM 文件。例如:

    powershellCopy Code
    Mount-WindowsImage -Path "C:\Mount" -ImagePath "C:\Images\myimage.wim" -Index 1

    这里,-Path 是你想要挂载映像的目录,-ImagePath 是 WIM 文件的路径,-Index 是你想要挂载的映像在 WIM 文件中的索引。

  3. 获取服务列表:一旦映像被挂载,你可以使用 DISM 命令行工具来获取服务列表。由于 PowerShell 直接支持命令行执行,你可以使用 dism 命令,并指定你的映像路径。例如:

    powershellCopy Code
    dism /Image:C:\Mount /Get-Features

    这里,/Image:C:\Mount 指定了你的映像挂载路径。/Get-Features 参数用于列出所有功能,包括服务。

  4. 分析输出/Get-Features 命令将列出所有功能和它们的状态(例如,启用或禁用)。虽然这个命令主要用于显示功能,但某些服务也会作为功能列出,因此你可以从这里获取服务信息。

  5. 卸载映像:完成操作后,不要忘记使用 Dismount-WindowsImage cmdlet 卸载映像并保存更改(如果有的话)。例如:

    powershellCopy Code
    Dismount-WindowsImage -Path "C:\Mount" -Save

请注意,上述步骤主要适用于处理 Windows 映像文件(如 WIM 文件)。如果你需要操作的是实际运行的系统或其他类型的映像文件,可能需要使用不同的方法或工具。


在PowerShell中处理离线Windows映像时,如果你想要读取服务注册表信息,可以通过加载注册表蜂巢(Hive)的方式来实现。这个过程涉及将离线映像的系统注册表文件加载到当前运行的系统注册表中,然后使用PowerShell或其他工具查询或修改这些信息。

以下是一个基于PowerShell的步骤,展示如何加载离线映像的服务注册表信息,进行读取和操作:

  1. 挂载Windows映像:首先,确保你的Windows映像已经被挂载到一个文件夹。如果还没有挂载,可以使用Mount-WindowsImage cmdlet挂载WIM文件。

  2. 打开PowerShell:以管理员权限打开PowerShell。

  3. 加载注册表蜂巢:你需要加载SYSTEM蜂巢来访问服务配置信息。这可以通过reg load命令完成。例如,如果你的映像挂载在C:\Mount路径下,那么SYSTEM蜂巢通常位于C:\Mount\Windows\System32\config\SYSTEM

    powershellCopy Code
    reg load HKLM\OfflineSystem C:\Mount\Windows\System32\config\SYSTEM

    这里,HKLM\OfflineSystem是一个你选择的键名,用于在你的本地机器注册表中临时表示这个离线的SYSTEM蜂巢。

  4. 查询服务信息:一旦加载了SYSTEM蜂巢,你就可以使用PowerShell查询服务信息了。例如,要获取特定服务的信息,可以使用Get-ItemProperty cmdlet。

    powershellCopy Code
    Get-ItemProperty -Path HKLM:\OfflineSystem\ControlSet001\Services\<ServiceName>

    替换<ServiceName>为你想要查询的服务名称。

  5. 完成操作后卸载蜂巢:完成操作后,不要忘记卸载之前加载的蜂巢,以避免对系统造成潜在影响。

    powershellCopy Code
    reg unload HKLM\OfflineSystem

在PowerShell中获取在线系统的服务列表相对简单,通常使用Get-Service cmdlet即可。但是,要获取离线系统的服务列表,我们需要采取不同的方法,因为离线系统的服务状态信息储存在其注册表中,尤其是在SYSTEM蜂巢下的ControlSet001\Services路径。以下是一个步骤指南,展示了如何通过加载离线系统的注册表蜂巢来获取服务列表。

准备工作

  1. 挂载离线系统的磁盘:首先,确保你可以访问离线系统的文件系统。如果是从WIM映像操作,请先将其挂载到一个文件夹。如果是从另一个硬盘或分区操作,确保你可以访问其Windows目录。

  2. 以管理员权限打开PowerShell:这是因为加载注册表蜂巢需要管理员权限。

加载离线系统的注册表蜂巢

  1. 加载SYSTEM蜂巢:使用以下命令加载离线系统的SYSTEM蜂巢到你的当前系统注册表中。假设离线系统的Windows目录位于D:\Windows

    powershellCopy Code
    reg load HKLM\OfflineSystem D:\Windows\System32\config\SYSTEM

    这里,HKLM\OfflineSystem是你为离线系统的SYSTEM蜂巢指定的键名。

获取服务列表

  1. 使用PowerShell查询服务信息:现在,你可以通过访问HKLM:\OfflineSystem\ControlSet001\Services来获取服务列表。以下命令列出了所有服务的名称:

    powershellCopy Code
    Get-ChildItem -Path HKLM:\OfflineSystem\ControlSet001\Services | ForEach-Object { $_.Name }

    或者,如果你想要获取更详细的信息(例如,每个服务的启动类型),可以使用:

    powershellCopy Code
    Get-ChildItem -Path HKLM:\OfflineSystem\ControlSet001\Services | ForEach-Object {
        $service = Get-ItemProperty -Path $_.PsPath
        [PSCustomObject]@{
            Name = $service.PSChildName
            DisplayName = $service.DisplayName
            StartType = switch ($service.Start) {
                0 {"Boot"}
                1 {"System"}
                2 {"Automatic"}
                3 {"Manual"}
                4 {"Disabled"}
                default {"Unknown"}
            }
        }
    } | Format-Table -AutoSize

清理工作

  1. 卸载蜂巢:完成操作后,不要忘记卸载之前加载的蜂巢:

    powershellCopy Code
    reg unload HKLM\OfflineSystem

通过上述步骤,你可以获取一个离线系统的服务列表,包括服务名称、显示名称和启动类型等信息。请注意,直接操作注册表涉及风险,建议在进行此类操作之前备份相关数据,并确保你对所执行操作的后果有充分的了解。


在Windows系统中,获取挂载映像的系统服务列表通常涉及使用Deployment Image Servicing and Management (DISM) API或Windows Imaging API。这些API允许应用程序与Windows映像文件(如WIM文件)进行交互,包括获取服务列表等操作。

DISM API

DISM API提供了一套接口,用于管理和服务Windows映像。通过DISM API,开发人员可以编程方式挂载映像、查询映像信息、修改映像内容等。获取挂载映像的系统服务列表通常涉及以下步骤:

  1. 初始化DISM会话:首先,需要使用DismInitialize函数初始化DISM API。
  2. 打开在线或离线映像:使用DismOpenSession函数打开一个映像会话。对于离线映像,需要指定映像的路径。
  3. 获取服务信息:可以通过调用DismGetFeatures函数来获取映像中的功能列表,这其中也包括系统服务。虽然这个函数主要用于获取功能(Features)信息,但某些情况下,服务也被视为一种特殊的功能。
  4. 关闭会话和卸载DISM:操作完成后,使用DismCloseSession关闭会话,并通过DismShutdown函数卸载DISM API。

Windows Imaging API

Windows Imaging API是另一套用于处理Windows映像文件的API。它允许应用程序创建、编辑和查询WIM文件的内容。虽然Windows Imaging API提供了广泛的功能,用于操作映像文件,但直接获取映像内服务列表的API调用可能不如DISM API那样直接。

示例代码和更多信息

由于DISM API和Windows Imaging API都是以C语言提供的,因此需要使用C或兼容语言(如C++)来调用这些API。这里没有直接的PowerShell命令或简单的API调用示例来获取服务列表,因为这通常涉及到较为复杂的编程操作。

如果你的目标是在PowerShell脚本或命令行工具中获取服务列表,使用DISM命令行工具或PowerShell的DISM模块(例如,使用Get-WindowsFeature)可能是更简单直接的方法。

对于深入开发,建议查阅Microsoft官方文档中的DISM API和Windows Imaging API部分,以获取详细的API描述和示例代码。


在PowerShell中,你可以使用类似的逻辑来获取服务列表并保存到文件,例如:

powershellCopy Code
Get-ChildItem -Path HKLM:\SYSTEM\CurrentControlSet\Services | Out-File Z:\Services.txt

或者,为了获取更详细的输出(包括子项),可以结合使用Get-ChildItemForEach-Object

在PowerShell中,你可以使用Get-ChildItem cmdlet来枚举注册表键下的所有项,并使用ForEach-Object cmdlet来处理每个项。然后,你可以将输出结果重定向到文本文件中。以下是一个示例脚本,它展示了如何枚举HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services注册表键下的所有服务,并将相关信息输出到文本文件中。

powershellCopy Code
# 设置要查询的注册表路径
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services"

# 设置输出文件的路径
$outputFile = "C:\Services.txt"

# 使用Get-ChildItem获取所有服务,ForEach-Object处理每个服务
Get-ChildItem -Path $regPath | ForEach-Object {
    # 获取当前服务的名称
    $serviceName = $_.Name

    # 可以选择获取更多的详细信息,例如描述
    $serviceDescription = (Get-ItemProperty -Path $_.PsPath -Name Description).Description

    # 输出服务名称和描述
    "$serviceName, $serviceDescription"
} | Out-File -FilePath $outputFile

# 输出完成消息
Write-Host "服务列表已经保存到$outputFile"

这个脚本首先定义了要查询的注册表路径和输出文件的路径。然后,它使用Get-ChildItem来枚举指定路径下的所有项(本例中为所有服务)。对于每个服务,脚本使用ForEach-Object来处理,并从每个服务项中获取服务名称和描述(如果需要,还可以获取其他属性)。最后,这些信息被重定向到指定的输出文件中。


通过加载和查询注册表蜂巢来获取服务列表。这个过程涉及到将挂载的Windows映像中的SYSTEM注册表蜂巢加载到当前运行的系统中,然后查询相关的注册表项来获取服务列表。

步骤 1: 加载注册表蜂巢

假设你已经按照前面的步骤挂载了映像到C:\Mount路径下。现在,我们将从该挂载点加载SYSTEM蜂巢:

  1. 打开PowerShell窗口为管理员。

  2. 执行以下命令来加载SYSTEM蜂巢:

    powershellCopy Code
    $mountedRegPath = "C:\Mount\Windows\System32\config\SYSTEM"
    reg load HKLM\TempSystem $mountedRegPath

    这里,HKLM\TempSystem是一个临时的键名,用于在你的系统注册表中表示加载的蜂巢。请确保选择一个唯一的键名以避免与现有键冲突。

步骤 2: 查询服务列表

加载了SYSTEM蜂巢后,你可以查询其中的服务配置:

powershellCopy Code
Get-ChildItem -Path HKLM:\TempSystem\ControlSet001\Services | ForEach-Object {
    $service = Get-ItemProperty -Path $_.PsPath
    [PSCustomObject]@{
        Name = $_.Name
        DisplayName = $service.DisplayName
        StartType = $service.Start
        Description = $service.Description
    }
} | Export-Csv -Path "C:\ServicesList.csv" -NoTypeInformation

这个命令会枚举所有服务,并为每个服务创建一个包含名称、显示名称、启动类型和描述的对象。最后,这些对象被导出到一个CSV文件中。

步骤 3: 卸载注册表蜂巢

完成查询后,不要忘记卸载之前加载的蜂巢:

powershellCopy Code
reg unload HKLM\TempSystem

 

标签:服务,Windows,映像,API,注册表,挂载,PowerShell
From: https://www.cnblogs.com/suv789/p/18008388

相关文章

  • PowerShell 中使用相关命令管理 FFU(Full Flash Update)映像
    PowerShell中使用相关命令管理FFU(FullFlashUpdate)映像的示例:获取系统中的Windows映像信息:powershellCopyCodeGet-WindowsImage挂载指定的Windows映像:powershellCopyCodeMount-WindowsImage-ImagePath"C:\path\to\image.ffu"-Index1-Path"C:\mount"......
  • ICD.exe 是一种用于创建和自定义 Windows 映像的工具,可以在离线或在线环境中运行
    Microsoft提供了WindowsImagingandConfigurationDesigner(ICD)工具,用于创建和自定义Windows映像。ICD工具可以帮助管理员轻松地创建、编辑和管理Windows映像,并提供了许多功能和选项来满足不同的需求。FFU(FullFlashUpdate)映像是一种完整的映像文件,可以在设备上......
  • WSL2挂载USB设备
    U盘插入电脑后,WSL并不会识别出U盘,如果想要在WSL中使用或查看U盘文件,需要挂载USB设备。首先建一个用来挂载USB设备里文件的文件夹:sudomkdir/mnt/e挂载(Windows里显示USB设备为哪个盘,就将E换成对应的字母):sudomount-tdrvfsE:/mnt/e现在就可以在WSL里访问USB设备里的内容了......
  • 在PowerShell中管理Windows映像主要涉及到DISM模块的Cmdlets。这些Cmdlets提供了一系
    在PowerShell中管理Windows映像主要涉及到DISM模块的Cmdlets。这些Cmdlets提供了一系列功能,包括挂载(加载)、卸载(卸下)映像,添加或删除驱动程序,应用更新等。以下是一些常用的Cmdlets和它们的参数,以及相应的实例。常用CmdletsMount-WindowsImage-ImagePath:指定WIM文件的路径。-I......
  • PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框
    PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框架。PowerShell运行在Windows、Linux和macOS上。创建一个思维导图来概述PowerShell命令可能包括以下几个主要部分:基础命令操作Get-Help:获取命令帮助Get-Command:查找命令Get-Member:查看对......
  • PowerShell编写Windows服务器的DDNS-ipv6客户端
    复制下面这个代码保存成“ddnsv6.fm20.cn.ps1”然后运行functionGet-GUID(){#指定注册表路径$path="HKLM:\Software\Firadio"#如果注册表路径不存在则创建if(-not(Test-Path$path)){New-Item-Force-Path$path>$null}#尝试......
  • 在K8S中,PVC创建和挂载失败原因有哪些?
    在Kubernetes(K8S)中,PersistentVolumeClaim(PVC)创建和挂载失败的原因可能有多种。以下是可能导致PVC创建或挂载失败的常见原因:存储资源不足:如果集群中的可用存储资源(PersistentVolume)不足以满足PVC的请求容量或者访问模式(例如ReadWriteOnce、ReadOnlyMany或Rea......
  • 跟着微软官方学习Powershell-在 PowerShell 中发现命令
    1、说明PowerShell预安装了大量命令。若要有效地使用PowerShell命令,您需要了解它们的工作原理。例如,你需要知道命令所采用的参数,以及可以使用多种方法来调用命令。它还有助于了解命令返回的内容、返回的类型以及命令的属性。通过了解这些事项,你可以配置如何显示帮助。此外,还......
  • 【数据库数据恢复】Oracle数据库ASM磁盘组掉线,ASM实例不能挂载的数据恢复案例
    oracle数据库故障&分析:oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。oracle数据库数据恢复过程:1、将oracle数据库所涉及磁盘以只读方式备份。后续的数据分析和数据恢复操作都基于镜像文件进行,避免对原始磁盘数据造成二次破坏。2、基于......
  • Linux 挂载磁盘到指定目录 或根目录
    Linux挂载磁盘到指定目录1.查看主机上所以得磁盘列表fdisk-l可以发现还有一个500G磁盘但是没有进行分区并使用2.对该磁盘进行分区fdisk/dev/vda 然后我们在使用fdisk-l 这个时候发现已经分区了.3.格式化磁盘mkfs.ext4目录这个地方有可能会失败找不到目录......