سؤال

لدي التركيب الإعداد ابتكارات التي يمكنني استخدامها لتحديث أجهزة الكمبيوتر في مواقع العملاء.عموما هناك جهازي كمبيوتر ، ولكن في بعض الأحيان ثلاثة أو أكثر.كلها متصلة بالشبكة ، وواحدة بالضبط مقطوعة الرأس.

فمن السهل نسبيا لتشغيل المثبت على جميع برئاسة (إذا كان هذا هو عكس مقطوعة الرأس?) محطات العمل ، وبالتالي تشغيل جميع المهام المرتبطة بهذه الحواسيب.هناك أيضا مهام يجب تنفيذها على محطة العمل مقطوعة الرأس.بشكل عام ، هذه مهام سريعة وبسيطة (نسخ الملفات الصغيرة وإعادة تشغيل الخدمات) يمكن تشغيلها عدة مرات.

ومع ذلك ، في بعض الأحيان ، أواجه مهام تستغرق وقتا طويلا يتم تنفيذها بشكل أفضل مرة واحدة بالضبط ، مثل المهام التي تتطلب إعادة التشغيل.في هذه الحالة بالذات ، ولست بحاجة لتحديد ما إذا كان لدي نسخة مكسورة من أولترفنك تثبيت ، وأفضل طريقة أعرف من هو الاستعلام عن التسجيل على محطة العمل مقطوعة الرأس.للأسف, RegQueryStringValue لا يوفر خيارات للاستعلام عن السجلات على الأجهزة البعيدة.

كيف يمكن للمرء أن يفعل ذلك?

هل كانت مفيدة؟

المحلول

هذه القضية معقدة بسبب شيئين:

  1. أولترفنك بتثبيت نفسه في عرض 64 بت من التسجيل على ويندوز 64 بت ، لذلك نحن بحاجة إلى الاستعلام عن كل من وجهات النظر ، و
  2. ريموتيريجيستري لا يعمل افتراضيا على ويندوز فيستا والإصدارات الأحدث.

هذا ما توصلت إليه:

function RegConnectRegistry(machineName: String; hKeyRoot:Integer; var phKey: Integer): integer;
  external 'RegConnectRegistryA@Advapi32.dll';
function RegOpenKeyEx(hKeyRoot:Integer; subkey:string; reserved, access:integer; var phKey: Integer): integer;
  external 'RegOpenKeyExA@Advapi32.dll';
function RegQueryValueEx(hKey:Integer; value: String; reserved: integer; var pType: integer; data: string; var pDataLen:integer): integer;
  external 'RegQueryValueExA@Advapi32.dll';
function RegCloseKey(hKey:Integer): integer;
  external 'RegCloseKey@Advapi32.dll';

ثم ، استدعاء وظائف واضحة نسبيا.تم حذف معظم معالجة الأخطاء للإيجاز.أيضا ، لم يتم إجراء أي محاولة لقراءة القيم غير ريغسز.

<target> هو الهدف ، إما بالاسم أو عن طريق عنوان إب. <key> و <value> هي مفتاح بعيد وقيمة الاستعلام.

procedure CheckRemoteVNC();
var
  HKRM, key: Integer;
  data: string;
  dwType, dataLen, retVal: Integer;
begin
  data := '12345678901234567890'; { Padding. Digits so I can easily count how long it is. }
  dataLen := 20
  { Make sure the Remote Registry service is running }
  Exec('sc', ExpandConstant('\\<target> start RemoteRegistry'), '', SW_HIDE, ewWaitUntilTerminated, retVal)
  RegConnectRegistry('<target>', HKEY_LOCAL_MACHINE, HKRM)
  if RegOpenKeyEx(HKRM, '<key>', 0, 1 {KEY_QUERY_VALUE}, key) = 2 {Bad registry entry} then
    { Try the 64-bit view. }
    retVal := RegOpenKeyEx(HKRM, '<key>', 0, 257 {0x101 == KEY_WOW64_64KEY | KEY_QUERY_VALUE}, key)
  RegQueryValueEx(Key, '<value>', 0, dwType, data, dataLen)
  data := Copy(data, 0, dataLen-1)

  { Deal with the data appropriately. }

  if key <> 0 then RegCloseKey(key)
  if HKRM <> 0 then RegCloseKey(HKRM)
end;

انظر وثائق مايكروسوفت على هذه الوظائف لمزيد من التفاصيل.

نصائح أخرى

ربما تكون أسهل طريقة هي كتابة برنامج صغير يستخدم واجهة برمجة تطبيقات التسجيل مباشرة للاستعلام عن الخادم البعيد وإرجاع رمز الخروج إلى ابتكارات مع النتيجة.
خيار آخر هو استخدام بسيكسيك أو ما شابه ذلك لتشغيل التطبيق الذي يقوم بالعمل على الملقم البعيد نفسه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top