2010-08-13 30 views
8

Tôi đã cài đặt một số MSI với GUID (0733556C-37E8-4123-A801-D3E6C5151617). Chương trình đăng ký trong registry: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \()Cách tìm vị trí chương trình trong sổ đăng ký, nếu tôi biết MSI GUID?

Value UninstallString = msiexec.exe/I (0733556C-37E8-4123-A801-D3E6C5151617)

Câu hỏi của tôi là: tiện ích MsiExec.exe biết tên và đường dẫn đến tệp bạn muốn chạy khi bạn xóa chương trình bằng cách nào? Bạn có thể tìm thấy thông tin này trong registry ở đâu?

+0

Đã có câu trả lời rất hay, nhưng ** cách dễ nhất ** để nhận thông tin về sản phẩm đã cài đặt của bạn có thể là [** sử dụng lệnh PowerShell đơn giản **] (https://stackoverflow.com/questions/29937568/how -can-i-find-the-product-guid-of-an-cài đặt-msi-setup/29937569 # 29937569) –

+0

Đọc lại lần nữa Tôi nghĩ rằng tôi đã hiểu sai câu hỏi của bạn.Tôi cho rằng câu trả lời thực tế cho câu hỏi của bạn là tất cả thông tin về các sản phẩm đã cài đặt được lưu trữ trong sổ đăng ký dưới '' HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer''. Đây là ** cơ sở dữ liệu Windows Installer ** và bạn không bao giờ phải chạm trực tiếp vào bất kỳ giá trị nào tại đây. Thay vào đó bạn có thể truy cập chúng thông qua [Win32 API calls (C++)] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa369426 (v = vs.85) .aspx) hoặc bạn có thể sử dụng [COM tự động hóa] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa367810 (v = vs.85) .aspx) (dễ dàng hơn). –

Trả lời

12

Windows giữ thông tin cấu hình Windows Installer ẩn và được mã hóa trong Registry. Nó không thể duyệt bằng mắt người như các phần khác của Registry.

Để truy vấn/sửa đổi/xóa thông tin này, bạn sẽ cần phải sử dụng các chức năng MSI.
(Installer Function Reference)

Đối với câu hỏi cụ thể của bạn, hãy thử chức năng MsiGetProductInfo.

+2

Ẩn và mã hóa - thực sự? – Rup

+1

Xem [Tạo Bộ cài đặt Windows, Phần 2] (http://blogs.msdn.com/b/windows_installer_team/archive/2006/05/12/595950.aspx) từ [Nhóm Trình cài đặt Windows] (http: //blogs.msdn.com/b/windows_installer_team/). Xem Quy tắc 21: Tránh sử dụng dữ liệu cấu hình mà bạn không sở hữu. Nó nói, "Dữ liệu này được quản lý bởi trình cài đặt và truy cập trực tiếp bởi người dùng hoặc ứng dụng không được khuyến khích; trên thực tế, một số dữ liệu được mã hóa để làm cho việc thao tác thủ công trở nên rất khó khăn". –

0

Bản đồ chính đó là HKEY_CLASSES_ROOT\Installer\Products\.

+0

HKEY_CLASSES_ROOT \ Installer \ Sản phẩm \ không bao gồm đường dẫn đến chương trình đã cài đặt. Tôi tìm thấy nó ở đâu? – Yuriy

+1

Nó không cần đường dẫn đến ứng dụng đã được cài đặt, điều gì sẽ xảy ra nếu nó cài đặt 10 ứng dụng ?, tất cả những gì cần là đường dẫn đến trình gỡ cài đặt (hoặc mô-đun .msi). Hãy xem @ đầu ra của "danh sách sản phẩm wmic" tại dòng lệnh. –

+0

Thực ra tôi cần phải xác định vị trí ứng dụng (ổ đĩa) để ước tính không gian đĩa sẵn có trước khi cài đặt bản vá msp. Tôi có thể xác định vị trí của ứng dụng đã cài đặt nếu tôi chỉ biết hướng dẫn trong HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {} không? – Yuriy

7

Bạn có thể thử, từ dòng lệnh:

wmic product where "Name like '%your software here%'" get Name, Version, PackageCode 
+3

Rất tuyệt! nhưng cmq của tôi nói đó là truy vấn không hợp lệ ... – BlackBear

1

Có một tiện ích miễn phí từ Tarma nghiên cứu phần mềm mà tôi thấy hữu ích cho việc này. Lấy nó từ their website.

7

Đây là chương trình C# đơn giản sử dụng MsiGetProductInfo, như William Leara nói, để có được vị trí thực của trình cài đặt được lưu trong bộ nhớ cache trên đĩa.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Int32 len = 512; 
     System.Text.StringBuilder builder = new System.Text.StringBuilder(len); 
     MsiGetProductInfo("{89C098E5-C108-49F9-9B1D-10503C6D8A05}", "LocalPackage", builder, ref len); 
     Console.WriteLine(builder.ToString()); 
     Console.ReadLine(); 
    } 

    [DllImport("msi.dll", CharSet = CharSet.Unicode)] 
    static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); 
} 
1

Bạn không cần bất kỳ phần mềm nào. Điều này là làm việc trong Windows 10 và tôi nghĩ rằng nó hợp lệ cho windows 7 là tốt.

Nếu mã sản phẩm của bạn là 0733556C-37E8-4123-A801-D3E6C5151617. Hãy thử tìm chìa khóa C65533708E7332148A103D6E5C516171 (về cơ bản nó bị đảo ngược) một khi bạn tìm thấy nó, hãy duyệt tìm khóa con InstallProperties, nếu không tồn tại, hãy thử tìm kết quả khác. Một khi bạn đã tìm thấy InstallProperties, hãy mở và tìm khóa LocalPackage. Và sau đó bạn có đường dẫn cho gói msi mà MSI lưu dưới dạng Cache khi bạn cài đặt ứng dụng của mình.

1

Tiền đề của câu hỏi này là gây hiểu nhầm vì UninstallString trong sổ đăng ký không được sử dụng khi thực hiện gỡ cài đặt. Đi trước và thay đổi chuỗi để kiểm tra điều này - nó sẽ không sử dụng chuỗi thay đổi của bạn.

Mặc dù tham chiếu đến nội dung trong sổ đăng ký có thể hấp dẫn, câu trả lời ngắn gọn là dữ liệu Windows Installer trong sổ đăng ký là chi tiết triển khai. Câu hỏi về cơ bản là hỏi MsiConfigureProduct (.... INSTALLSTATE_ABSENT ...) hoạt động như thế nào, và nó là vô nghĩa để đoán chi tiết triển khai và nó có thể ở đâu trong registry. Đó là tất cả các API xuống. Có thể có một tác vụ thực tế mà người đăng có thể đã muốn hoàn thành, nhưng nó bị che dấu bởi một câu hỏi về cách hoạt động của các lần gỡ cài đặt.

+0

Chắc chắn đồng ý - không bao giờ có thể chấp nhận truy cập trực tiếp vào chi tiết cơ sở dữ liệu MSI, hoặc thậm chí chỉ để giải mã nó mà nhiều người dường như đang làm với những thứ họ tìm thấy trong sổ đăng ký. –

Các vấn đề liên quan