Melakukan Panggilan Asinkron dengan VBScript

Melakukan panggilan asinkron ke metode WMI atau metode penyedia memungkinkan skrip untuk terus mengeksekusi saat objek kembali ke objekSWbemSink, dan ditangani oleh metode seperti SWbemSink.OnObjectReady. Namun, panggilan asinkron tidak disarankan karena data mungkin tidak dikembalikan pada tingkat keamanan yang sama dengan panggilan yang dilakukan.

Saat menggunakan panggilan sink asinkron seperti SWbemSink.OnObjectReady untuk mendapatkan data yang dikembalikan, Anda dapat mengatur nilai registri berikut.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault

Mengatur nilai registri ini memastikan autentikasi objek data yang dikembalikan ke sink. Jika UnsecAppAccessControlDefault diatur menjadi satu (1), maka WMI melakukan pemeriksaan akses pada pengembalian data. Pemeriksaan akses memverifikasi bahwa data berasal dari sumber yang benar. Untuk informasi selengkapnya, lihat Pengaturan Keamanan pada panggilan asinkron.

Metode asinkron dengan nama yang berakhiran "Async_" selalu kembali segera setelah dipanggil sehingga program dapat terus dieksekusi. Misalnya, SWbemServices.ExecQuery sinkron dan memblokir eksekusi hingga semua objek dikembalikan. Metode SWbemServices.ExecQueryAsync adalah versi asinkron nonblok. Cara yang lebih aman untuk melakukan panggilan ke SWbemServices.ExecQuery nonblocking adalah dengan melakukan panggilan secara semisinkron. Untuk informasi selengkapnya, lihat Mengatur Keamanan pada Panggilan Asinkron dan Melakukan Panggilan Semisinkron dengan VBScript.

Parameter iFlags untuk panggilan asinkron selalu default ke nol (0). Metode asinkron tidak menyediakan koleksi SWbemObjectSet ke sub-rutin penerima. Sebagai gantinya, subrutin peristiwa SWbemSink.OnObjectReady dalam aplikasi atau skrip Anda menerima setiap objek saat disediakan.

Ketika panggilan asinkron asli selesai, ia memanggil peristiwa SWbemSink.OnCompleted dari sink objek, dan menjalankan kode yang Anda tempatkan di sana untuk memproses hasil dari panggilan tersebut.

Nota

Halaman Server Aktif (ASP) sebagai host skrip tidak mendukung panggilan asinkron.

 

Prosedur berikut menjelaskan cara melakukan panggilan asinkron dengan menggunakan VBScript.

Untuk melakukan panggilan asinkron menggunakan VBScript

  1. Sambungkan ke WMI dan dapatkan objekSWbemServices.

    Set Service = GetObject("Winmgmts:")
    
  2. Buat objek sink menggunakan CreateObject atau, khusus untuk Windows Script Host 2.0, tag OBJECT dengan atribut peristiwa diset ke TRUE.

    Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
    

    -atau-

    <OBJECT progid="WbemScripting.SWbemSink" ID="SINK" events="true"/>
    
  3. Buat subroutine untuk setiap peristiwa yang dapat dipicu oleh peristiwa asinkron. Peristiwa ini didefinisikan sebagai metode pada SWbemObject. Misalnya, WMI melakukan panggilan balik ke SWbemSink.OnObjectReady saat setiap instans dikembalikan.

    Saat Anda membuat subroutine, tempatkan kode di subroutine untuk menangani setiap event ketika diterima.

    Sub SINK_OnCompleted(
          iHResult, 
          objErrorObject, 
          objAsyncContext
          )
        WScript.Echo "Asynchronous operation is done."
    End Sub
    
    Sub SINK_OnObjectReady(objObject, objAsyncContext)
        WScript.Echo (objObject.Name)
    End Sub
    

    Periksa parameter iHresult yang dikembalikan oleh peristiwa OnCompleted untuk menentukan apakah panggilan asinkron berhasil, atau jika terjadi kesalahan. Jika berhasil, nilai yang diteruskan dalam parameter iHresult sama dengan nol (0). Nilai lain mungkin menunjukkan kesalahan, dan Anda harus memeriksa nilai dalam objek kesalahan yang dikembalikan dalam parameter objErrorObject.

  4. Lakukan panggilan asinkron dan berikan nama sink Anda di parameter objWbemSink .

    Service.InstancesOfAsync sink, "Win32_process"
    
  5. Lakukan panggilan yang mencegah skrip berakhir sebelum semua event diterima. Jika skrip Anda dapat berjalan dengan antarmuka layar, cara sederhana untuk melakukan ini adalah dengan menggunakan perintah Echo Windows Script Host (WSH), yang ditunjukkan dalam contoh berikut.

    WScript.Echo "Waiting for instances."
    

    Saat Anda menjalankan skrip ini, Anda mungkin melihat instans pertama kembali sebelum pesan Menunggu instans, atau Anda mungkin melihatnya setelahnya. Ini adalah sifat pemrosesan asinkron. Jika Anda menutup kotak pesan Menunggu instance terlalu dini, Anda mungkin tidak melihat semua instance.

  6. Jika Anda memiliki hasil dari beberapa panggilan asinkron yang berbeda yang kembali ke sink yang sama, simpan data pembeda yang diperlukan dalam parameter konteks objWbemAsyncContext.

  7. Setelah selesai dengan sink, batalkan panggilan asinkron Anda dengan metode Batalkan.

    objwbemsink.Cancel()
    

    MetodeCancel menginstruksikan WSH untuk membatalkan semua panggilan asinkron yang terkait dengan objek sink tertentu. Oleh karena itu, Anda mungkin ingin menggunakan bak cuci terpisah untuk operasi asinkron yang perlu memiliki independensi.

  8. Lepaskan objek sink dengan mengatur objek sink ke Nothing.

    set objwbemsink= Nothing
    

Contoh kode berikut menunjukkan kueri asinkron untuk semua instans Win32_Process di komputer lokal. Untuk versi semisinkron dari metode yang sama, lihat Memanggil Metode.

' Create an object sink
set oSink = WScript.CreateObject("wbemscripting.swbemsink","sink_")
' Connect to WMI and the cimv2 namespace, and obtain
' an SWbemServices object
set oSvc = GetObject("winmgmts:root\cimv2")

bdone = false
' Query for all Win32_Process objects
osvc.ExecQueryAsync oSink, "SELECT Name FROM Win32_Process"
' Wait until all instances are returned. 
' The bdone flag prevents the script from exiting until
' the sink.OnCompleted subroutine is executed when
' all the objects are returned.
while not bdone    
    wscript.sleep 1000
wend

' The sink subroutine to handle the OnObjectReady 
' event. This is called as each object returns.
sub sink_OnObjectReady(oInst, octx)
    WScript.Echo "Got Instance: " & oInst.Name
end sub
' The sink subroutine to handle the OnCompleted event.
' This is called when all the objects are returned. 
' The oErr parameter obtains an SWbemLastError object,
' if available from the provider.
sub sink_OnCompleted(HResult, oErr, oCtx)
    WScript.Echo "ExecQueryAsync completed"
    bdone = true
end sub

Memanggil Metode

Menjaga Keamanan WMI