[英]Accessing all 3 hives in the registry
Creating a 32 bit application with delphi I do not have access to all hives depending whether the application is run on a win32 or win64 windows machine. 使用delphi创建32位应用程序我无法访问所有配置单元,具体取决于该应用程序是在Win32还是Win64 Windows计算机上运行。 Here is a link for default access: http://msdn.microsoft.com/en-us/library/aa390789(v=VS.85).aspx 这是默认访问权限的链接: http : //msdn.microsoft.com/zh-cn/library/aa390789(v=VS.85).aspx
I just want to create a single application, and not a separate version for 32 & 64. And I would like to use WMI and retrieve information from the 32 bit registry hive, the 64 bit registry hive and the WOW6432Node. 我只想创建一个应用程序,而不是为32和64创建单独的版本。我想使用WMI并从32位注册表配置单元,64位注册表配置单元和WOW6432Node中检索信息。 There are FLAGS to set but I can't figure out how to send the flags with a regular WMI query call from my delphi application. 有要设置的标志,但我不知道如何通过delphi应用程序中的常规WMI查询调用发送标志。 Here is info about the FLAGs: http://msdn.microsoft.com/en-us/library/aa393067(v=VS.85).aspx 这是有关标志的信息: http : //msdn.microsoft.com/zh-cn/library/aa393067( v=VS.85) .aspx
GLibWmi & DelphiWmiCodeCreator exmple: GLibWmi和DelphiWmiCodeCreator示例:
function GetWMIObject(const objectName: String): IDispatch; //create the Wmi instance
var
chEaten: Integer;
BindCtx: IBindCtx;
Moniker: IMoniker;
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));
end;
procedure GetWin32_StartupCommandInfo;
var
objWMIService : OLEVariant;
colItems : OLEVariant;
colItem : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
objWMIService := GetWMIObject('winmgmts:\\localhost\root\CIMV2');
colItems := objWMIService.ExecQuery('SELECT * FROM Win32_StartupCommand','WQL',0);
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
Writeln('');
end;
end;
REVISED CODE: 修改后的代码:
procedure GetWin32_StartupCommandInfo(aIDispatch: IDispatch);
var
objWMIService : OLEVariant;
colItems : OLEVariant;
colItem : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
objWMIService := aIDispatch; //GetWMIObject('winmgmts:\\localhost\root\CIMV2');
colItems := objWMIService.ExecQuery('SELECT * FROM Win32_StartupCommand','WQL',0);
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
with Form1.lst1 do begin
items.Add(Format('Caption="%s"; Location="%s"',[colItem.Caption,colItem.Location]));// String
{items.Add(Format('Command %s',[colItem.Command]));// String
items.Add(Format('Description %s',[colItem.Description]));// String
items.Add(Format('Location %s',[colItem.Location]));// String
items.Add(Format('Name %s',[colItem.Name]));// String
items.Add(Format('SettingID %s',[colItem.SettingID]));// String
items.Add(Format('User %s',[colItem.User]));// String
items.Add(Format('UserSID %s',[colItem.UserSID]));// String
}
items.Add('');
end;
end;
end;
function MyConnectWMI(wmiHost:string; var Services: ISWbemServices):Boolean;
const
STR_CIM2_ROOT ='root\CIMV2';
STR_EMPTY = '';
var
NVS: SWbemNamedValueSet;
providerArchitecture : OleVariant;
requiredArchitecture : OleVariant;
Locator : ISWbemLocator; //CoSWbemLocator;
begin
try
providerArchitecture := 32; // or 64
requiredArchitecture := true;
NVS := CoSWbemNamedValueSet.Create( );
NVS.Add('__ProviderArchitecture', providerArchitecture , 0);
NVS.Add('__RequiredArchitecture', requiredArchitecture , 0);
// Create the Location object
Locator := CoSWbemLocator.Create();
// Connect to the WMI service, with the root\cimv2 namespace
Services := Locator.ConnectServer(wmiHost,
STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY,STR_EMPTY, 0, NVS);
Result := True;
except
Result := False;
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
aServices: ISWbemServices;
begin
if MyConnectWMI('localhost', aServices) then
GetWin32_StartupCommandInfo(aServices);
end;
You're using a WMI Moniker and as far as I can see you can't specify the options you need via it. 您正在使用WMI Moniker,据我所知,您无法通过它指定所需的选项。 You need to use the SWbemLocator object instead as that let's you pass the SWbemNamedValueSet as the final parameter. 您需要使用SWbemLocator对象,因为我们将SWbemNamedValueSet传递为最终参数。
There is a ConnectWMI function in the UProcedures.pas file of GLibWMI. GLibWMI的UProcedures.pas文件中有一个ConnectWMI函数。 It passes a nil to the final parm: 它将零传递给最终参数:
Services := Locator.ConnectServer(wmiHost,
STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY,STR_EMPTY, 0, nil);
You need to create an alternative, something like this: 您需要创建一个替代方案,如下所示:
var
NVS: SWbemNamedValueSet;
providerArchitecture : OleVariant;
requiredArchitecture : OleVariant;
/////
providerArchitecture := 32; // or 64
requiredArchitecture := true;
NVS := CoSWbemNamedValueSet.Create();
NVS.Add('__ProviderArchitecture', providerArchitecture , 0);
NVS.Add('__RequiredArchitecture', requiredArchitecture , 0);
// Create the Location object
Locator := CoSWbemLocator.Create();
// Connect to the WMI service, with the root\cimv2 namespace
Services := Locator.ConnectServer(wmiHost,
STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY,STR_EMPTY, 0, NVS);
That will get you an ISWbemServices interface on which you can then execute ExecQuery. 这将为您提供一个ISWbemServices接口,您可以在其上执行ExecQuery。
Accessing the registry via StdRegProv - 通过StdRegProv访问注册表-
procedure Get_RegistryValue(aIDispatch: IDispatch);
var
objWMIService : OLEVariant;
strKeyPath : OLEVariant;
strValue : OLEVariant;
strOut : OLEVariant;
objStdRegProv : OLEVariant;
begin;
objWMIService := aIDispatch;
objStdRegProv := objWMIService.Get('StdRegProv');
strKeyPath := 'Software\Microsoft\Wbem\CIMOM';
strValue := 'Logging';
objStdRegProv.GetStringValue(HKEY_LOCAL_MACHINE, strKeyPath, strValue, strOut);
with Form1.lst1 do begin
items.Add(strOut);
end;
end;
end;
// connect to root\default instead of cimv2
function MyConnectWMI(wmiHost:string; var Services: ISWbemServices):Boolean;
const
STR_DEFAULT_ROOT = 'root\default'
STR_EMPTY = '';
var
NVS: SWbemNamedValueSet;
providerArchitecture : OleVariant;
requiredArchitecture : OleVariant;
Locator : ISWbemLocator; //CoSWbemLocator;
begin
try
providerArchitecture := 32; // or 64
requiredArchitecture := true;
NVS := CoSWbemNamedValueSet.Create( );
NVS.Add('__ProviderArchitecture', providerArchitecture , 0);
NVS.Add('__RequiredArchitecture', requiredArchitecture , 0);
// Create the Location object
Locator := CoSWbemLocator.Create();
// Connect to the WMI service, with the root\cimv2 namespace
Services := Locator.ConnectServer(wmiHost,
STR_DEFAULT_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY,STR_EMPTY, 0, NVS);
Result := True;
except
Result := False;
end;
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.