Điều kiện toàn cầu của SCCM Loại không truy vấn WQL (wbemErrTypeMismatch - 0x80041005)


8

Chúng tôi đã xử lý tất cả logic nhắm mục tiêu của chúng tôi cho Gói (và giờ là Ứng dụng) với Bộ sưu tập. Bây giờ chúng tôi đã chuyển từ SCCM 2007 sang SCCM 2012 SP1, chúng tôi khuyên chúng tôi nên chuyển logic đó sang mô hình Chương trình ứng dụng và triển khai nó bằng Điều kiện và yêu cầu toàn cầu. Điều này có một số lợi ích tích cực - Bộ sưu tập được sử dụng hoàn toàn cho việc phân nhóm hoặc phân cấp logic, chúng tôi có được triển khai Ứng dụng liền mạch hơn khi sử dụng Supercedence và logic Phát hiện được cải thiện.

Tôi sẽ sử dụng Plugin Adobe Flash Player làm ví dụ. Chúng tôi chỉ muốn triển khai Plugin Adobe Flash Player cho các máy trạm đã cài đặt Firefox. Sử dụng mô hình Chương trình gói SCCM 2007, chúng tôi sẽ tạo Bộ sưu tập dựa trên truy vấn WQL có chứa tất cả các máy trạm có cài đặt Firefox:

select *  from  SMS_R_System inner join SMS_G_System_SoftwareProduct
on SMS_G_System_SoftwareProduct.ResourceId = SMS_R_System.ResourceId
where SMS_G_System_SoftwareProduct.ProductName like "Mozilla Firefox"

Khi chúng tôi đã tạo Bộ sưu tập, chúng tôi sẽ triển khai Chương trình Gói của chúng tôi theo nó. Tôi đang cố gắng sao chép cùng một logic bằng cách sử dụng logic Điều kiện và yêu cầu toàn cầu của Chương trình ứng dụng. Tất cả các nỗ lực của tôi để xây dựng truy vấn WQL dựa trên điều kiện toàn cầu của tôi đều dẫn đến lỗi wbemErrTypeMismatch ( 2147749893 (0x80041005)).



Bây giờ, các thực tiễn tốt nhất khuyên chúng ta nên giữ logic nhắm mục tiêu đi kèm với Ứng dụng, điều chúng ta cần làm là tạo một truy vấn WQL phù hợp Điều kiện toàn cầu và sau đó chúng ta có thể đánh giá nó bằng Yêu cầu của ứng dụng.

Hãy bắt đầu với truy vấn WQL. Tôi đã sử dụng Scriptomatic để kết xuất mọi thứ trong SMS_InstalledSoftwareLớp WMI, một phần của root\cimv2\smskhông gian tên. Tôi chắc chắn chắc chắn rằng SMS_InstalledSoftware là nơi tốt nhất để chạy các truy vấn khi cố gắng đánh giá xem có thứ gì được cài đặt hay không vì Win32_Sản phẩm chỉ dành cho phần mềm cài đặt Windows Installer.

Tôi tìm thấy các đối tượng liên quan đến Firefox sau đây:

ARPDisplayName: Mozilla Firefox 23.0.1 (x86 en-US)
ChannelCode: 
ChannelID: 
CM_DSLID: 
EvidenceSource: CPXCCCCCCXCXCXCXXXXXCXXXXX

InstallDirectoryValidation: 4
InstalledLocation: C:\Program Files (x86)\Mozilla Firefox
InstallSource: 
InstallType: 0
Language: 0
LocalPackage: 
MPC: 
OsComponent: 0
PackageCode: 
ProductID: 
ProductName: Mozilla Firefox 23.0.1 (x86 en-US)
ProductVersion: 23.0.1
Publisher: Mozilla
RegisteredUser: 
ServicePack: 
SoftwareCode: mozilla firefox 23.0.1 (x86 en-us)
SoftwarePropertiesHash: 63896ed23146ec91dbc763b45c127ba31216e2f9d657a87953440d30b7f306bc
SoftwarePropertiesHashEx: 67c2ecc42f0e0b9da6ee55bc0dea67a4d90b9e8452c9fdb25db57d4891698f25
UninstallString: "C:\Program Files (x86)\Mozilla Firefox\uninstall\helper.exe"
UpgradeCode: 
VersionMajor: 2147483647
VersionMinor: 2147483647



Chạy WQL đối với thuộc tính ProductName có vẻ là một cách tốt để đi. Nếu tôi chạy SELECT * FROM SMS_InstalledSoftware WHERE ProductName like '%Firefox%'trong wbemtestso với root\cimv2\smsnamespace tôi nhận được những điều sau đây:

kết quả wbemtest



Hãy thử xây dựng Điều kiện toàn cầu trong SCCM tiếp theo:

Truy vấn điều kiện toàn cầu



Điều này là hoàn toàn không trực quan nhưng tôi nghĩ rằng tôi hiểu nó một cách chính xác. Điều kiện toàn cầu chỉ thiết lập phần điều kiện của toàn bộ logic Chương trình ứng dụng chứ không phải bất kỳ logic chương trình ứng dụng đánh giá nào . Vì lý do đó, tôi không làm gì trong mệnh đề WHERE. Điều kiện toàn cầu này sẽ tìm trong root\cimv2\smskhông gian tên cho SMS_InstalledSoftwarelớp và "trả lại" thuộc tính ProductName. Bây giờ tôi có thể đánh giá giá trị / s của Tài sản đó với Yêu cầu Loại triển khai ứng dụng của mình, phải không?

Yêu cầu SCCM



Một lần nữa - Tôi không hiểu làm thế nào toàn bộ logic Điều kiện / Yêu cầu Toàn cầu kết hợp với nhau hoặc chỉ là điều này không trực quan nhưng Yêu cầu ở trên có thể xem xét tất cả các Chuỗi được trả về từ thuộc ProductNametính, đánh giá xem có bất kỳ chuỗi nào chứa 'Firefox không 'và nếu rất vui vẻ triển khai Plugin Adobe Flash Player.

Thật không may, nó không hoạt động. Hầu hết tất cả các máy trong Triển khai đều trả về lỗi sau:

2147749893 (0x80041005) Type Mismatch

Tôi hiểu điều này có nghĩa là Điều kiện toàn cầu đang trả về một loại biến khác với đánh giá trong Yêu cầu của tôi nhưng tôi không biết làm thế nào để khắc phục sự cố từ đây. Tôi đã thử đặt loại Điều kiện toàn cầu của mình thành Boolean và đặt mệnh đề WHERE ( Name like '%Firefox%') nhưng điều này cũng gây ra lỗi tương tự.

Làm cách nào tôi có thể sao chép Bộ sưu tập dựa trên truy vấn WQL của mình bằng logic nhắm mục tiêu Điều kiện / Yêu cầu toàn cầu của Chương trình ứng dụng? Tôi còn thiếu gì ở đây (ngoài apt-get)?

Câu trả lời:


1

Hộp thoại Điều kiện toàn cầu có lẽ là phần không trực quan nhất của SCCM mà tôi đã thấy cho đến nay.

Hãy thử xem:

  1. tạo lại Điều kiện toàn cầu Firefox 2 của bạn theo cách tương tự, nhưng lần này trong trường Mệnh đề nơi truy vấn WQL ở dưới cùng, hãy đặt: ProductName like "%Firefox%"

  2. Trong tab Yêu cầu của Loại triển khai ứng dụng của bạn, hãy sử dụng Điều kiện toàn cầu của Firefox 2, nhưng thay đổi Loại quy tắc thành Hiện sinh


0

Đây là phỏng đoán đủ điều kiện, vì tôi không có cách nào để kiểm tra điều này, thực hành

Vì WQL không có toán tử ngăn chặn riêng, tôi tin rằng Containstoán tử được xử lý như trong PowerShell:

$referenceCollection -Contains $testValue

Nếu lý thuyết này là chính xác, logic Yêu cầu cơ bản của bạn sẽ mở rộng sang điều này:

"Microsoft Firefox 23 (en-us)" -Contains "firefox"

Nếu toán hạng bên trái của -Containskhông phải là một tập hợp, mà là một thể hiện cùng loại với giá trị thử nghiệm (như trong ví dụ của bạn, hai chuỗi), -Containsđược xử lý chính xác như -eq.

Do đó, "Microsoft Firefox 23 (en-us)" -Contains "firefox"sẽ luôn luôn trả lại sai.


0

Cá nhân tôi sẽ sử dụng tập lệnh powershell cho việc này thay vì truy vấn WQL. Quyền hạn của tôi sẽ thực hiện chính xác điều tương tự như WQL mà bạn đang thực hiện (thậm chí truy vấn cùng một lớp WMI) nhưng nó sẽ hoạt động bằng cách sử dụng booleean, vd

$Firefox = Get-WmiObject -namespace root\cimv2\sms -class SMS_InstalledSoftware -filter "ARPDisplayName LIKE '%Firefox%'"
if($Firefox){return $true}else{return $false}

Điều này về cơ bản sẽ trả về true nếu truy vấn WMI trả về kết quả và false nếu không. Về cơ bản, bạn có thể sử dụng điều kiện chung trên ứng dụng của mình dọc theo dòng: Firefox 2 phải bằng đúng. Bây giờ tôi đã thực hiện điều này rất nhiều bằng cách sử dụng phương pháp này chủ yếu cho các mục cấu hình và phương pháp phát hiện ứng dụng trong đó MSI nếu không được sử dụng.

Nếu bạn muốn tiếp tục làm mọi thứ như hiện tại thì tôi sẽ phải đồng ý với @ 1.618 ý kiến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.