virt-win-reg(1) Virtualization Support virt-win-reg(1)

virt-win-reg - استخراج و ادغام مدخل‌های رجیستری ویندوز در یک ماشین مجازی مهمان

virt-win-reg domname 'HKLM\Path\To\Subkey'
virt-win-reg domname 'HKLM\Path\To\Subkey' name
virt-win-reg domname 'HKLM\Path\To\Subkey' @
virt-win-reg --merge domname [input.reg ...]
virt-win-reg [--options] disk.img ... # به جای domname

شما نباید از "virt-win-reg" همراه با گزینه --merge روی ماشین‌های مجازی فعال و در حال اجرا (live) استفاده کنید. در صورت انجام این کار، دیسک ماشین مجازی به صورت غیرقابل برگشت آسیب خواهد دید و تخریب می‌شود. برنامه "virt-win-reg" تلاش می‌کند مانع از انجام این کار شود، اما همه حالت‌ها را پوشش نمی‌دهد.

ویرایش رجیستری ویندوز ماهیتاً عملیاتی پرخطر است. قالب آن عمداً مبهم و مستندسازی‌نشده است و اعمال تغییرات نادرست در رجیستری می‌تواند سیستم را غیرقابل بوت کند. بنابراین، هنگام استفاده از گزینه --merge، ابتدا مطمئن شوید که یک نسخه پشتیبان مطمئن تهیه کرده‌اید.

این برنامه می‌تواند مدخل‌های رجیستری ویندوز را از یک ماشین مجازی مهمان ویندوز استخراج کرده یا در آن ادغام کند.

اولین پارامتر، نام مهمان در libvirt یا ایمیج خام دیسک ماشین مجازی ویندوز است.

اگر گزینه --merge مشخص not نشود، کلید رجیستری انتخاب‌شده (به صورت بازگشتی) نمایش داده/استخراج می‌شود. برای مثال:

$ virt-win-reg Windows7 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft'

همچنین می‌توانید مقادیر منفرد را از درون کلیدهای رجیستری نمایش دهید؛ برای مثال:

$ cvkey='HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
$ virt-win-reg Windows7 $cvkey ProductName
Windows 7 Enterprise

با استفاده از --merge، می‌توانید یک فایل متنی regedit را در رجیستری ویندوز ادغام کنید:

$ virt-win-reg --merge Windows7 changes.reg

این برنامه فقط برای دسترسی‌های ساده به رجیستری طراحی شده است. اگر می‌خواهید عملیات پیچیده‌ای روی رجیستری انجام دهید، پیشنهاد می‌کنیم فایل‌های کندوی رجیستری (hive files) را با استفاده از libguestfs(3) یا guestfish(1) از ماشین مهمان دریافت کرده و به صورت محلی، مثلاً با استفاده از hivex(3)، hivexsh(1) یا hivexregedit(1) به آن‌ها دسترسی پیدا کنید.

نمایش راهنمای خلاصه.
نمایش شماره نسخه و خروج.
فعال‌سازی پیام‌های اشکال‌زدایی.
در صورت استفاده از libvirt، به URI داده‌شده متصل می‌شود. اگر مشخص نشود، به هایپروایزر پیش‌فرض libvirt متصل خواهد شد.

اگر دستگاه‌های بلوکی مهمان را مستقیماً مشخص کنید، به هیچ وجه از libvirt استفاده نمی‌شود.

قالب ایمیج‌های دیسک ارائه‌شده در خط فرمان را تعیین می‌کند. اگر مشخص نشود، قالب به طور خودکار از محتوای ایمیج دیسک تشخیص داده می‌شود.

اگر ایمیج‌های دیسک از libvirt درخواست شوند، برنامه این اطلاعات را از libvirt استعلام می‌کند. در این حالت مقدار پارامتر format نادیده گرفته می‌شود.

هنگام کار با ایمیج‌های دیسک خام مهمان که غیرقابل‌اعتماد هستند، همیشه باید قالب دیسک را صراحتاً تعیین کنید.

در حالت ادغام، این گزینه یک فایل متنی regedit را در رجیستری ویندوزِ ماشین مجازی ادغام می‌کند. اگر این پرچم داده نشود، "virt-win-reg" در عوض مدخل‌های رجیستری را نمایش داده یا استخراج می‌کند.

توجه داشته باشید که استفاده از --merge روی ماشین‌های مجازی فعال و روشن ناامن است و منجر به خرابی دیسک می‌شود؛ اما استخراج اطلاعات (بدون این پرچم) همیشه ایمن است.

هنگام ادغام (فقط)، ممکن است لازم باشد کدگذاری رشته‌های مورد استفاده در فایل کندو (hive) را تعیین کنید. این موضوع به تفصیل در بخش "ENCODING STRINGS" از Win::Hivex::Regedit(3) توضیح داده شده است.

حالت پیش‌فرض استفاده از UTF-16LE است که باید با نسخه‌های جدید ویندوز کار کند.

هنگام استخراج (فقط)، فرض می‌کند که رشته‌ها دارای کدگذاری UTF-16LE هستند و آن‌ها را به جای توالی‌های هگزادسیمال به صورت رشته متنی چاپ می‌کند. همچنین در صورت وجود، نویسه صفر پایانی را از انتهای رشته حذف می‌کند.

این کار ناامن است و به دلایل مختلف صحت و امانت رشته‌ها را در رجیستری اصلی حفظ نمی‌کند:

  • فرض می‌کند کدگذاری اصلی UTF-16LE است. رشته‌های ASCII و رشته‌ها با سایر کدگذاری‌ها در اثر این تبدیل خراب می‌شوند.
  • فرض می‌کند هر داده‌ای با نوع ۱ یا ۲ واقعاً رشته است و سایر داده‌ها رشته نیستند؛ اما فیلد نوع داده در رجیستری‌های واقعی همیشه قابل‌اعتماد نیست.
  • اطلاعات مربوط به اینکه آیا یک نویسه صفر در انتهای رشته در رجیستری وجود داشته یا خیر را از بین می‌برد.

همه این موارد به این دلیل رخ می‌دهد که خود رجیستری اطلاعاتی درباره نحوه کدگذاری رشته‌ها در بر ندارد (بخش "ENCODING STRINGS" در Win::Hivex::Regedit(3) را ببینید).

تنها برای بررسی سریع و اشکال‌زدایی محتوای رجیستری باید از این گزینه استفاده کنید، و هرگز نباید زمانی که قرار است خروجی به برنامه دیگری فرستاده شود یا در رجیستری دیگری ذخیره گردد از آن استفاده نمایید.

این برنامه در حال حاضر از مهمان‌های مبتنی بر Windows NT از ویندوز XP تا حداقل ویندوز ۸ پشتیبانی می‌کند.

کلیدهای رجیستری زیر پشتیبانی می‌شوند:

"HKEY_LOCAL_MACHINE\SAM"
"HKEY_LOCAL_MACHINE\SECURITY"
"HKEY_LOCAL_MACHINE\SOFTWARE"
"HKEY_LOCAL_MACHINE\SYSTEM"
"HKEY_USERS\.DEFAULT"
"HKEY_USERS\SID"
که در آن SID شناسه امنیتی کاربر ویندوز (مانند "S-1-5-18") است.
"HKEY_USERS\username"
که در آن username نام کاربر محلی است (این یک افزونه اختصاصی libguestfs است).

می‌توانید از "HKLM" به عنوان مخفف "HKEY_LOCAL_MACHINE" و از "HKU" به عنوان مخفف "HKEY_USERS" استفاده کنید.

کلیدهای لفظی "HKEY_USERS\$SID" و "HKEY_CURRENT_USER" پشتیبانی نمی‌شوند (هیچ «کاربر فعلی» وجود ندارد).

قابلیت "fast startup" ویندوز ۸ می‌تواند مانع از توانایی virt-win-reg در ویرایش رجیستری شود. بخش "WINDOWS HIBERNATION AND WINDOWS 8 FAST STARTUP" در guestfs(3) را ببینید.

برنامه "virt-win-reg" انتظار دارد که فایل‌های regedit از قبل با کدگذاری محلی بازکدگذاری شده باشند. معمولاً در سیستم‌های لینوکس میزبان، این به معنی UTF-8 با پایان خطوط سبک یونیکس است. از آنجا که فایل‌های regedit ویندوز غالباً در قالب UTF-16LE با پایان خطوط ویندوزی هستند، ممکن است نیاز باشد کل فایل را قبل یا بعد از پردازش بازکدگذاری کنید.

برای تبدیل مجدد کدگذاری یک فایل از قالب ویندوز به لینوکس (پیش از پردازش با گزینه --merge)، می‌توانید دستوری شبیه به این را اجرا کنید:

iconv -f utf-16le -t utf-8 < win.reg | dos2unix > linux.reg

برای انجام عکس این عمل، پس از استخراج و قبل از ارسال فایل برای یک کاربر ویندوز، دستوری مانند زیر اجرا کنید:

unix2dos linux.reg | iconv -f utf-8 -t utf-16le > win.reg

برای اطلاعات بیشتر درباره کدگذاری، Win::Hivex::Regedit(3) را ببینید.

اگر درباره کدگذاری فعلی مطمئن نیستید، از دستور file(1) استفاده کنید. نسخه‌های اخیر برنامه regedit.exe ویندوز یک فایل UTF-16LE با پایان خطوط ویندوزی (CRLF) تولید می‌کنند، مانند:

$ file software.reg
software.reg: Little-endian UTF-16 Unicode text, with very long lines,
with CRLF line terminators

این فایل قبل از آنکه بتوانید آن را با --merge ادغام کنید، نیازمند تبدیل خواهد بود.

کلیدهای رجیستری مانند "CurrentControlSet" در سطح فایل کندو (hive) واقعاً در رجیستری ویندوز وجود ندارند و بنابراین نمی‌توانید مستقیماً آن‌ها را تغییر دهید.

مقدار "CurrentControlSet" معمولاً نام مستعاری (alias) برای "ControlSet001" است. در برخی شرایط ممکن است به مجموعه کنترل دیگری اشاره داشته باشد. راه تشخیص آن، بررسی کلید "HKLM\SYSTEM\Select" است:

# virt-win-reg WindowsGuest 'HKLM\SYSTEM\Select'
[HKEY_LOCAL_MACHINE\SYSTEM\Select]
"Current"=dword:00000001
"Default"=dword:00000001
"Failed"=dword:00000000
"LastKnownGood"=dword:00000002

مقدار "Current" همان مجموعه‌ای است که ویندوز هنگام بوت انتخاب خواهد کرد.

به طور مشابه، سایر کلیدهای "Current..." در مسیر نیز ممکن است نیاز به جایگزینی داشته باشند.

برای حذف یک کلید کامل رجیستری، از نحو زیر استفاده کنید:

[-HKEY_LOCAL_MACHINE\Foo]

برای حذف یک مقدار مشخص در درون یک کلید، از نحو زیر استفاده کنید:

[HKEY_LOCAL_MACHINE\Foo]
"Value"=-

توجه داشته باشید که برخی از این نکات، ایمیج دیسک مهمان را تغییر می‌دهند. ماشین مهمان باید خاموش باشد، در غیر این صورت با خرابی دیسک مواجه خواهید شد.

یک اسکریپت دسته‌ای DOS (فایل bat)، وی‌بی‌اسکریپت (VBScript) یا فایل اجرایی آماده کنید. این فایل را با استفاده از guestfish(1) بارگذاری نمایید. در این مثال نام اسکریپت "test.bat" است و در "C:\" بارگذاری می‌شود:

guestfish -i -d WindowsGuest upload test.bat /test.bat

یک فایل regedit حاوی تغییرات رجیستری آماده کنید:

cat > test.reg <<'EOF'
[HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce]
"Test"="c:\\test.bat"
EOF

در این مثال ما از کلید "RunOnce" استفاده می‌کنیم که به این معنی است که اسکریپت دقیقاً یک بار هنگام ورود اولین کاربر اجرا می‌شود. اگر می‌خواهید هر بار که کاربری وارد سیستم می‌شود اجرا گردد، "RunOnce" را با "Run" جایگزین کنید.

اکنون رجیستری را به‌روزرسانی کنید:

virt-win-reg --merge WindowsGuest test.reg

این بخش فرض می‌کند که با سرویس‌های ویندوز آشنایی دارید و یا برنامه‌ای دارید که پروتکل Service Control ویندوز را مستقیماً مدیریت می‌کند، یا می‌خواهید هر برنامه‌ای را با استفاده از یک پوسته‌ساز سرویس مانند SrvAny یا نسخه رایگان RHSrvAny اجرا نمایید.

ابتدا برنامه و در صورت تمایل پوسته سرویس را بارگذاری کنید. در این حالت نام برنامه آزمایشی "test.exe" است و ما از پوسته RHSrvAny استفاده می‌کنیم:

guestfish -i -d WindowsGuest <<EOF
  upload rhsrvany.exe /rhsrvany.exe
  upload test.exe /test.exe
EOF

یک فایل regedit حاوی تغییرات رجیستری آماده کنید. در این مثال، اولین تغییر رجیستری برای خود سرویس یا پوسته سرویس (در صورت استفاده) لازم است. دومین تغییر رجیستری صرفاً به این دلیل نیاز است که ما از پوسته سرویس RHSrvAny استفاده می‌کنیم.

cat > service.reg <<'EOF'
[HKLM\SYSTEM\ControlSet001\services\RHSrvAny]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="c:\\rhsrvany.exe"
"DisplayName"="RHSrvAny"
"ObjectName"="NetworkService"
[HKLM\SYSTEM\ControlSet001\services\RHSrvAny\Parameters]
"CommandLine"="c:\\test.exe"
"PWD"="c:\\Temp"
EOF

نکات:

  • برای استفاده از "ControlSet001" به بخش قبلی در همین صفحه راهنما مراجعه کنید. ممکن است نیاز باشد این مقدار را متناسب با مجموعه‌ای که توسط مهمان استفاده می‌شود تنظیم کنید.
  • گزینه "ObjectName" دسترسی‌ها و اختیارات سرویس را کنترل می‌کند. یک گزینه جایگزین "ObjectName"="LocalSystem" است که بالاترین سطح دسترسی را خواهد داشت.
  • برای آگاهی از مفهوم اعداد جادویی، این مقاله پایگاه دانش مایکروسافت را ببینید: http://support.microsoft.com/kb/103000

رجیستری را به‌روزرسانی کنید:

virt-win-reg --merge WindowsGuest service.reg

هنگام ارسال پارامترهای حاوی "\" (بک‌اسلش) در شل دقت کنید. معمولاً باید از 'نقل‌قول تکی' یا بک‌اسلش دوگانه (نه هر دو همزمان) برای محافظت از آن‌ها در برابر شل استفاده کنید.

مسیرها و نام مقادیر به بزرگی و کوچکی حروف حساس نیستند (case-insensitive).

hivex(3), hivexsh(1), hivexregedit(1), guestfs(3), guestfish(1), virt-cat(1), virt-tail(1), Sys::Guestfs(3), Win::Hivex(3), Win::Hivex::Regedit(3), Sys::Virt(3), http://libguestfs.org

Richard W.M. Jones http://people.redhat.com/~rjones

Copyright (C) 2010 Red Hat Inc.

این برنامه یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «مجوز عمومی همگانی گنو» (GNU GPL) منتشرشده توسط بنیاد نرم‌افزارهای آزاد، ویرایش ۲ یا (به انتخاب خودتان) هر نسخه بالاتری بازتوزیع کرده یا تغییر دهید.

این برنامه به این امید توزیع شده است که مفید واقع شود، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابلیت تجاری یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر به «مجوز عمومی همگانی گنو» مراجعه کنید.

شما باید به همراه این برنامه یک نسخه از مجوز عمومی همگانی گنو را دریافت کرده باشید؛ اگر دریافت نکرده‌اید، به بنیاد نرم‌افزارهای آزاد به آدرس زیر بنویسید: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

برای دریافت فهرستی از اشکالات مربوط به libguestfs، از پیوند زیر استفاده کنید: https://bugzilla.redhat.com/buglist.cgi?component=libguestfs&product=Virtualization+Tools

برای گزارش یک اشکال جدید در libguestfs، از پیوند زیر استفاده کنید: https://bugzilla.redhat.com/enter_bug.cgi?component=libguestfs&product=Virtualization+Tools

هنگام گزارش اشکال، لطفاً موارد زیر را ارائه دهید:

  • نسخه libguestfs.
  • محل دریافت libguestfs (مثلاً کدام توزیع لینوکس، کامپایل‌شده از سورس و غیره).
  • شرح دقیق اشکال و روشی برای بازتولید آن.
  • دستور libguestfs-test-tool(1) را اجرا کرده و خروجی کامل و دست‌نخورده آن را در گزارش اشکال قرار دهید.
2026-07-11 guestfs-tools-1.56.0