2010-02-03 25 views
6

Chúng tôi có một ứng dụng không được quản lý C++ xuất hiện gây ra lời nhắc UAC. Điều này dường như xảy ra trên Win7 và NOT trên VistaTrợ giúp với sự hiểu biết tại sao hộp thoại UAC bật lên trên Win7 cho ứng dụng của chúng tôi

Thật không may là UAC dlg là phương thức hệ thống nên tôi không thể đính kèm trình gỡ lỗi để kiểm tra mã của nó và chạy dưới msdev (chúng tôi đang sử dụng 2008) chạy ở chế độ cao.

Chúng tôi đặt một hộp thông báo ở đầu chương trình/winmain của chúng tôi nhưng nó thậm chí không nhận được điều đó đến nay, vì vậy rõ ràng đây là trong mã khởi động.

Điều gì có thể gây ra thông báo UAC quá sớm và tôi có thể làm gì khác để theo dõi nguyên nhân?

EDIT

Rõ ràng biểu hiện là một vấn đề quan trọng ở đây, nhưng có vẻ như không được giúp đỡ tôi - hoặc có lẽ tôi không cấu hình file manifest một cách chính xác.

Ai đó có thể cung cấp tệp kê khai mẫu không?

Ngoài ra, ma thuật liên kết/UAC có nhận ra rằng chương trình "có thể" ghi vào sổ đăng ký và đặt các yêu cầu UAC của nó dựa trên đó không? Có những đường dẫn mã có thể kích hoạt UAC, nhưng chúng tôi thậm chí không ở điểm đó khi UAC dlg xuất hiện.

Một điều kỳ lạ khác là điều này dường như không xảy ra trên Vista với UAC được bật.

Dưới đây là một biểu hiện (mà tôi nghĩ là/được tạo tự động):

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level='asInvoker' uiAccess='false' /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' /> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

Và rồi một này đã được bổ sung vào danh sách manifest để xem nếu nó sẽ giúp

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
<assemblyIdentity 
    version="1.0.0.0" 
    processorArchitecture="x86" 
    name="[removed for anonymity]" 
    type="win32" 
/> 
<description> 
    [removed for anonymity] 
</description> 
<dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
      type="win32" 
      name="Microsoft.Windows.Common-Controls" 
      version="6.0.0.0" 
      processorArchitecture="x86" 
      publicKeyToken="6595b64144ccf1df" 
      language="*" 
     /> 
    </dependentAssembly> 
</dependency> 
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <requestedPrivileges>   
     <requestedExecutionLevel 
      level="asInvoker" 
      uiAccess="false"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

Các sau đây là từ EXE thực tế bằng cách sử dụng công cụ ManifestViewer

- <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="x86" name="[removed]" type="win32" /> 
    <description>[removed]</description> 
- <dependency> 
- <dependentAssembly> 
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" /> 
    </dependentAssembly> 
    </dependency> 
- <dependency> 
- <dependentAssembly> 
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /> 
    </dependentAssembly> 
    </dependency> 
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
- <security> 
- <requestedPrivileges> 
    <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
    </requestedPrivileges> 
    </security> 
    </trustInfo> 
    </assembly> 

Dường như nó có thể b e do cài đặt tương thích xp trên ứng dụng của chúng tôi. Tôi sẽ phải kiểm tra điều đó. (chúng tôi đã cài đặt trình cài đặt này vì một số trình điều khiển âm thanh không hoạt động chính xác trên win7)

+0

Bắt đầu bằng cách kiểm tra cài đặt UAC trên máy của bạn để xem mức độ nào kích hoạt lời nhắc. Điều này sẽ giúp thu hẹp mà có thể gây ra nó. –

+0

@AdamW - Bất kỳ cài đặt nào bên dưới quản trị viên đều làm điều này tôi nghĩ. Trong mọi trường hợp, chúng tôi không muốn các thông báo - và chúng tôi đang cố khắc phục vấn đề, nhưng khi hộp dlg là phương thức (nhờ MS) và không thể sao chép dưới trình gỡ rối và chúng tôi thậm chí không thể "gỡ lỗi" bằng cách sử dụng các hộp tin nhắn, chúng tôi đang bị mất để chẩn đoán hoặc sửa lỗi ... – Tim

+0

@gf - cảm ơn bạn đã chỉnh sửa. – Tim

Trả lời

11

Windows sẽ tự động nâng cao các ứng dụng dựa trên các tiêu chí khác nhau (được liệt kê trong Understanding and Configuring User Account Control in Windows Vista):

Trước khi một quá trình 32 bit được tạo ra, các thuộc tính sau được kiểm tra để xác định xem nó là một cài đặt:

  • Tên tệp bao gồm các từ khóa như "cài đặt", "thiết lập", "cập nhật", v.v.
  • Từ khóa trong phiên bản sau đây Mua lại trường ce: Nhà cung cấp, Tên công ty, Tên sản phẩm, Mô tả tệp, Tên tệp gốc, Tên nội bộ và Tên xuất.
  • Từ khóa trong tệp kê khai cạnh nhau được nhúng trong tệp thực thi.
  • Từ khóa trong các mục nhập StringTable cụ thể được liên kết trong tệp thực thi.
  • Thuộc tính chính trong dữ liệu RC được liên kết trong tệp thực thi.
  • Chuỗi mục tiêu của các byte trong tệp thực thi.

Giải pháp tốt nhất cho tất cả những điều này là create a manifest that prevents elevation, mặc dù đổi tên tệp có thể là đủ.

+0

Tôi theo liên kết đó và thêm "asInvoker" nhưng tôi vẫn nhận được UAC dlg. (lúc khởi động) Bất kỳ manh mối nào khác? Có lẽ tôi đã không tạo ra các biểu hiện chính xác? – Tim

+0

Làm cách nào để tôi biết được một trong những nguyên nhân đó đã gây ra yêu cầu nâng cao khi khởi động? Thông tin này là tuyệt vời, nhưng nó không có gì để xác định chính xác những gì tôi cần phải thay đổi để có được nó dừng lại ... Bất kỳ manh mối về cách làm điều đó? – Tim

+1

@tim: Đó là một câu hỏi hay và tôi không biết câu trả lời. (Khi tôi gặp vấn đề với điều này, đó là tên tập tin.) Tuy nhiên, ít nhất tôi cũng có thể đề nghị chạy 'sxstrace' để xác định xem đó có phải là vấn đề với tệp kê khai hay không. Và có lẽ một trong các thiết lập kiểm tra bảo mật trong 'gpedit.msc' sẽ ghi lại một cái gì đó hữu ích về phát hiện trình cài đặt cho trình xem sự kiện (nhưng có thể không). – bk1e

5

Nếu bạn thậm chí không nhận được chức năng chính của mình, thì một trong hai tệp DLL được ứng dụng của bạn sử dụng Khởi tạo DllMain hoặc ứng dụng của bạn có tệp kê khai yêu cầu độ cao.

Tôi nghĩ bạn có thể gỡ lỗi từ xa bằng windbg; khi lời nhắc được hiển thị, bạn có thể đột nhập vào trình gỡ rối và xem ứng dụng của bạn đang cố gắng làm gì.

+0

tệp kê khai không yêu cầu độ cao như xa như tôi có thể thấy. – Tim

2

Điều đầu tiên tôi sẽ kiểm tra là tệp kê khai ứng dụng. Đó là một trong những điều đầu tiên mà Windows xem xét khi tạo một quy trình. Nó chắc chắn tương tác với UAC.

+0

Và tôi đang tìm gì trong đó? – Tim

+0

'requestedExecutionLevel' nói riêng, nhưng điều đó có vẻ bình thường. – MSalters

1

Trên Windows 7 (nhưng không phải Vista) nếu bạn nói ứng dụng cần cài đặt tương thích với XP, ứng dụng cũng sẽ nâng cao. Xem Is UAC on Win7 different than Vista? - nếu bạn không cần nâng cấp, nhưng bạn cần phải được đánh dấu XP compat, tôi không nghĩ rằng có bất cứ điều gì bạn có thể làm. OTOH nếu bạn không cần phải là XP compat, hãy ngừng yêu cầu.

+0

Thật không may có một vấn đề trình điều khiển xấu cho Win7 rằng xp compat dường như sửa chữa ... Chúng tôi đang ở trong một bắt 22 có vẻ như. – Tim

0

Phụ thuộc Walker (depends.exe) wqs được viết bằng văn bản để khắc phục sự cố DLL, nhưng chế độ lược tả của nó hữu ích hơn thế. Nó có thể được sử dụng để nắm bắt rất nhiều thông tin về quá trình tạo. Nó sẽ là thú vị để xem cụ thể mà các DLL là cần thiết, và cái nào trong số đó đã được nạp tại thời điểm của dấu nhắc UAC. Nó cũng khá có thể là đầu ra từ Depenceny Walker đề cập đến UAC một cách rõ ràng.

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