ورود

View Full Version : حرفه ای: مشکل در فراخوانی متد EnumKey از کلاس StdRegProv



devil00x
شنبه 26 فروردین 1391, 19:54 عصر
با سلام خدمت دوستان عزیز.
من می خوام با wmi در رجیستری subkey های یک کلید رو بخوانم و نمایش بدم.
برای این کار از کلاس StdRegProv بایستی متد EnumKey را فراخوانی کرد، هر طور که می نویسم خطا می دم هر چی هم گشتم نمونه دلفی اون رو پیدا نکردم. خود msdn یک نمونه vbs گذاشته اونو اینجا قرار می دم از دوستان هر کس که می تونه یک نمونه قایل اجرای اونو تو دلفی برام بزاره ممنون میشم.

نمونه vbs:

const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\"&_
strComputer & "\root\default:StdRegProv")
strKeyPath = "SYSTEM\CurrentControlSet\Services"
objReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
WScript.Echo "Subkeys under " _
& "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servic es"
For Each subkey In arrSubKeys
WScript.Echo subkey
Next

اما کدی که من نوشتم :

CoInitialize(nil);
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\default', '', '');
FWbemObjectSet:= FWMIService.Get('StdRegProv');
StrKeyPath:='HKEY_LOCAL_MACHINE\SYSTEM\CurrentCont rolSet\Services';
FWbemObjectSet.EnumKey(HKEY_LOCAL_MACHINE,FInParam s.sSubKeyName,SubKeyNames);
این خط پیغام خطا می ده
-->error --> [DCC Error] Unit1.pas(58): E2160 Type not allowed in OLE Automation call

for name in SubKeyNames do
begin
Memo1.Lines.Add(Name);
end;

Felony
شنبه 26 فروردین 1391, 21:06 عصر
نرم افزار WMI Delphi Code Creator رو دانلود کنید و از طریق اون کد مورد نظر رو تولید کنید .

devil00x
یک شنبه 27 فروردین 1391, 08:49 صبح
ازت ممنونم مجتبی جان من این نرم افزار را دارم و کدم رو با اون هم ایجاد کردم اما مشکل من رو حل نکرد چون همون قسمتی که من می خام رو باز نتونست بسازه .
در واقع خوندن مقادیر بازگشتی .
کد ایجاد شده رو تا حدودی تغییر دادم تا نیازم رو برطرف کنه اما جایی رو که با ستاره تو کد مشخص کردم رو که محل نمایش خروجی هست نمی تونم در بیارم.


procedure Invoke_StdRegProv_EnumValues;
const
WbemUser ='';
WbemPassword='';
WbemComputer='localhost';
var
FSWbemLocator : ISWbemLocator;
FWMIService : ISWbemServices;
FWbemObject : ISWbemObject;
FInParams : ISWbemObject;
FOutParams : ISWbemObject;
varValue : OleVariant;
outcnt:integer;
keyname:string;
begin
FSWbemLocator := CoSWbemLocator.Create;
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword, '', '', 0, nil);
FWbemObject := FWMIService.Get('StdRegProv',0,nil);
FInParams := FWbemObject.Methods_.Item('EnumKey',0).InParameter s.SpawnInstance_(0);
varValue :=HKEY_LOCAL_MACHINE;
FInParams.Properties_.Item('hDefKey', 0).Set_Value(varValue);
varValue :='SYSTEM\CurrentControlSet\Services';
FInParams.Properties_.Item('sSubKeyName', 0).Set_Value(varValue);
FOutParams := FWMIService.ExecMethod('StdRegProv', 'EnumKey', FInParams,0 , nil);
//************************************************** *****************
for keyname in FOutParams.Properties_.Item('sNames',0).Get_Value do
Writeln(keyname);
//************************************************** *****************

end;

من درواقع همونطور که قبلن هم گفتم میخام subkey های یک کلید رو نمایش بدم.
با تشکر از دوستان....

devil00x
یک شنبه 27 فروردین 1391, 12:18 عصر
جهت توضیح بیشتر مقدار خروجی این متد همون sNames هستش که یک آرایه از رشته هاست.
حالا به نظر شما چطور میشه اون رو به خروجی فرستاد.
نحو این تابع با توجه به msdn به صورت زیر می باشد:

uint32 EnumKey(
[in, optional] uint32 hDefKey = HKEY_LOCAL_MACHINE,
[in] string sSubKeyName,
[out] string sNames[]
);

devil00x
یک شنبه 27 فروردین 1391, 20:27 عصر
دوستان لطفا کسی پاسخ بده!!!!!

devil00x
دوشنبه 28 فروردین 1391, 10:55 صبح
<?php
define('HKEY_LOCAL_MACHINE', 0x80000002);
$computer = 'SYSAD03'; //name of the station / pc
$reg = new COM("winmgmts:{impersonationLevel=impersonate}!\\\\$com puter\\root\\default:StdRegProv");

//$key_path = 'SOFTWARE\Microsoft'; // this line will get all services
$key_path = 'Software\Microsoft\Windows\CurrentVersion\Uninsta ll'; // this line will get all installed software

$sub_keys = new VARIANT();
$reg->EnumKey(HKEY_LOCAL_MACHINE,$key_path,$sub_keys);

foreach($sub_keys as $sub_key){
echo "$sub_key <br>";
}
?>

این هم یک نمونه کد php دوستان لطفا به داد من برسید چرا من نمی تونم تو دلفی این کار رو انجام بدم....

Mask
دوشنبه 28 فروردین 1391, 11:17 صبح
از این نمونه استفاده کنید.

devil00x
دوشنبه 28 فروردین 1391, 12:32 عصر
با تشکر از شما دوست عزیز ، اما من باید حتما با استفاده از همین توابع wmi این کار رو انجام بدم....
اگه لطف کنید و همین متد EnumKey رو نمونه ای ازش بزارین ممنون می شم.

devil00x
دوشنبه 28 فروردین 1391, 19:23 عصر
دوست عزیز واقعا از زحمت شما ممنونم ، اما چون من می خوام به صورت remote سیستم های یک شبکه رو رجیستری شون رو بخونم (البته این رو هم می دونم که با همون api های ویندوز میشه remote هم خوند) ولی محدودیت هایی داره که احساس می کنم این محدودیت ها در توابع wmi وجود نداره.
به همین دلیل هست که سراغ wmi رفتم.