2013-01-04 14 views
13

Chúng tôi đang sử dụng hàm sau để nhận số lượng bộ xử lý được chỉ định bởi cấu hình khởi động hiện tại. Con số này được sử dụng hoàn toàn cho việc đăng nhập.Không thể đọc thông tin BCDStore trên Windows 2012 Server bằng WMI

Chức năng dưới đây hoạt động tốt trên XP, Vista, 7, 2003 và 2008. Tuy nhiên, không thành công trên Windows 2012 Server.

// -1 = not implemented or not allowed 
// 0 = not limited 
// >0 = number of processors in the {current} boot entry 
function Internal_GetBCDNumberOfProcessors: integer; 
var 
    objBcdStore : OleVariant; 
    objElement : OleVariant; 
    objWBL  : OleVariant; 
    objWMIService: OleVariant; 
begin 
    // for more info, see: http://stackoverflow.com/questions/7517965/accessing-bcdstore-from-delphi/7527164#7527164 
    Result := -1; 
    try 
    objWMIService := GetObject('winmgmts:{(Backup,Restore)}\\.\root\wmi:BcdStore'); 
    if (not VarIsNull(objWMIService)) and 
     boolean(objWMIService.OpenStore('', objBcdStore)) and 
     (not VarIsNull(objBcdStore)) and 
     boolean(objBcdStore.OpenObject('{fa926493-6f1c-4193-a414-58f0b2456d1e}', objWBL)) and 
     (not VarIsNull(objWBL)) 
    then 
     if objWBL.GetElement($25000061, objElement) and //<-- fails here on Server 2012 
     (not VarIsNull(objElement)) 
     then 
     Result := StrToIntDef(objElement.Integer, 0) 
     else 
     Result := 0; 
    except 
    on E: EOleSysError do 
     Result := -1; 
    end; 
end; 

Nếu tôi cố gắng chạy nó trên Win2012, các objWBL.GetElement tăng EOleSysError ngoại lệ với văn bản OLE error D0000225. Google không tìm thấy bất cứ điều gì có ý nghĩa liên quan đến mã lỗi này :(

Stack trace nói rằng ngoại trừ được kích hoạt trong System.Win.ComObj.DispatchInvokeError mà được gọi bởi DispatchInvoke mà được gọi bởi VarDispInvoke.

Tất cả điều này đã được sao chép sử dụng XE2. tôi có thể cố gắng lặp lại các vấn đề với XE3 nhưng tôi không tin Delphi RTL có bất cứ điều gì để làm với nó.

Hiện ai có bất kỳ ý tưởng về lý do có thể cho hành vi này?

+0

Bạn có Cập nhật 4 hotfix 1 không? –

+0

Có, tôi nên có. Tôi sẽ kiểm tra lại. (Exe được xây dựng trên máy chủ xây dựng mà * nên * có cài đặt U4H1.) – gabr

+0

UAC bật hoặc tắt? Quá trình nâng lên hoặc không nâng lên? –

Trả lời

1

Phần GetElement:

if objWBL.GetElement($25000061, objElement) and //<-- fails here on Server 2012 
    (not VarIsNull(objElement)) 
then 
    Result := StrToIntDef(objElement.Integer, 0) 
else 
    Result := 0; 

có thể được thay thế với EnumerateElements:

if objWBL.EnumerateElements(objArray) then try 
    for i := VarArrayLowBound(objArray, 1) to VarArrayHighBound(objArray, 1) do begin 
    objElement := objArray[i]; 
    if objElement.Type = $25000061 then 
     Exit(objElement.Integer); 
    end; 
finally VarClear(objArray); end; 

này không làm tăng EOleException, nhưng thật đáng buồn cũng không tìm ra nguyên tố NumberOfProcessors.

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