Melakukan Panggilan Asinkron dengan VBScript

Melakukan panggilan asinkron ke metode WMI atau metode penyedia memungkinkan skrip untuk terus mengeksekusi sementara objek kembali ke objek SWbemSink , 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 PERANGKAT LUNAK\Microsoft\WBEM\CIMOM\UnsecAppAccessControlDefault

Mengatur nilai registri ini memastikan autentikasi objek data yang dikembalikan ke sink. Jika UnsecAppAccessControlDefault diatur ke satu (1), maka WMI melakukan pemeriksaan akses pengembalian data. Pemeriksaan akses memverifikasi bahwa data berasal dari sumber yang benar. Untuk informasi selengkapnya, lihat Mengatur 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 nonblocking. 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 subroutine sink. Sebagai gantinya, subroutine peristiwa SWbemSink.OnObjectReady dalam skrip atau aplikasi Anda menerima setiap objek seperti yang disediakan.

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

Catatan

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 objek SWbemServices .

    Set Service = GetObject("Winmgmts:")
    
  2. Buat sink objek menggunakan CreateObject atau (hanya untuk Windows Script Host 2.0) tag OBJECT dengan atribut peristiwa yang diatur 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 kembali.

    Saat Anda membuat subroutine, tempatkan kode di subroutine untuk menangani setiap peristiwa saat 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 tidak, 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 peristiwa diterima. Jika skrip Anda dapat berjalan dengan antarmuka layar, cara sederhana untuk melakukan ini adalah dengan menggunakan perintah Windows Script Host (WSH), Echo 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 instans terlalu cepat, Anda mungkin tidak melihat semua instans.

  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()
    

    Metode Batal menginstruksikan WSH untuk membatalkan semua panggilan asinkron yang terkait dengan objek sink tertentu. Dengan demikian, Anda mungkin ingin menggunakan sink terpisah untuk operasi asinkron yang harus independen.

  8. Lepaskan objek sink dengan menetapkan 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