Zugriff auf alle drei Bienenstöcke in der Registrierung
Frage
mit delphi eine 32-Bit-Anwendung erstellen Ich habe keinen Zugriff auf alle Nesselsucht je nachdem, ob die Anwendung auf einem win32 oder win64 Windows-Rechner ausgeführt wird. Hier ist ein Link für Standardzugriff: http: // msdn.microsoft.com/en-us/library/aa390789(v=VS.85).aspx
Ich will nur eine einzige Anwendung erstellen, und nicht um eine separate Version für 32 & 64. Und ich möchte WMI verwenden und Informationen aus der 32-Bit-Registrierungsstruktur abzurufen, die 64-Bit-Registrierungsstruktur und der WOW6432Node. Es gibt FLAGS zu belegen, aber ich kann nicht herausfinden, wie die Flaggen mit einem regelmäßigen WMI-Abfrage Anruf von meiner delphi-Anwendung zu senden. Hier Informationen über das FLAGS: http: // msdn .microsoft.com / en-us / library / aa393067 (v = VS.85) aspx
GLibWmi & DelphiWmiCodeCreator exmple:
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;
Lösung
Sie verwenden einen WMI-Moniker und soweit ich sehen kann man nicht die Optionen festlegen, können Sie über diese benötigen. Sie müssen das SWbemLocator Objekt verwenden, anstatt wie wollen sie Ihnen die SWbemNamedValueSet als letzten Parameter.
Es gibt eine ConnectWMI Funktion in der UProcedures.pas Datei von GLibWMI. Es geht eine Null an den letzten Parm:
Services := Locator.ConnectServer(wmiHost,
STR_CIM2_ROOT, {user}STR_EMPTY, {password}STR_EMPTY,
STR_EMPTY,STR_EMPTY, 0, nil);
Sie brauchen eine Alternative zu schaffen, so etwas wie folgt aus:
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);
Das wird Ihnen eine ISWbemServices bekommen Schnittstelle, auf der Sie dann ExecQuery ausführen.
Zugriff auf die Registrierung über 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;