我想列出所有启动类型设置为自动的服务。
我正在使用PowerShell 5。
那么如何从中提取字符串呢?
更进一步澄清,对于“@%systemroot%\system32\SearchIndexer.exe,-103”,显示名称为“Windows 搜索”。问题是,PowerShell 是否能够从“SearchIndexer.exe”中提取字符串“Windows 搜索”?如何实现?
更新:
基本上从如何从 DLL 提取字符串资源中窃取了代码。
我正在使用PowerShell 5。
$path = 'hklm:\SYSTEM\ControlSet001\Services'
$services = get-childitem $path | get-itemproperty -name 'Start'
foreach ($s in $services){
if($s.'Start' -like '2'){
$dn = get-itemproperty $s.'pspath' -name 'DisplayName'
echo $dn
}
}
但问题是,大部分条目使用的是这样的格式:
@%systemroot%\system32\SearchIndexer.exe,-103
@%SystemRoot%\System32\wscsvc.dll,-200
那么如何从中提取字符串呢?
更进一步澄清,对于“@%systemroot%\system32\SearchIndexer.exe,-103”,显示名称为“Windows 搜索”。问题是,PowerShell 是否能够从“SearchIndexer.exe”中提取字符串“Windows 搜索”?如何实现?
更新:
基本上从如何从 DLL 提取字符串资源中窃取了代码。
$source = @"
using System;
using System.Runtime.InteropServices;
using System.Text;
public class ExtractData
{
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern int LoadString(IntPtr hInstance, int ID, StringBuilder lpBuffer, int nBufferMax);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool FreeLibrary(IntPtr hModule);
public string ExtractStringFromDLL(string file, int number) {
IntPtr lib = LoadLibrary(file);
StringBuilder result = new StringBuilder(2048);
LoadString(lib, number, result, result.Capacity);
FreeLibrary(lib);
return result.ToString();
}
}
"@
Add-Type -TypeDefinition $source
$ed = New-Object ExtractData
$path = 'hklm:\SYSTEM\ControlSet001\Services'
$services = get-childitem $path | get-itemproperty -name 'Start' -ErrorAction SilentlyContinue
foreach ($s in $services){
if($s.'Start' -like '2'){
$dn = get-itemproperty $s.'pspath' -name 'DisplayName'
try{
$dn = $dn.DisplayName.Split(',')
$dn = $ed.ExtractStringFromDLL([Environment]::ExpandEnvironmentVariables($dn[0]).substring(1), $dn[1].substring(1))
}
catch{}
finally{
echo $dn
}
}
}
虽然很丑,但最终还是可以工作的......
$s
中)[Environment] :: ExpandEnvironmentVariables($s.Substring(1, $s.LastIndexOf(',')-1))
。 - Richard@%SystemRoot%\System32\wscsvc.dll,-200
变成了@%SystemRoot%\System32\wscsvc.dll
,并没有完全提取文件中的数据。但还是谢谢 :) - oNionAdd-Type -TypeDefinition $codeString
动态加载。 - Richard