Masalah dengan server patching jarak jauh menggunakan winrm dan Microsoft.Update.Session

10

Saya memiliki jaringan dengan server windows 2003, 2008 dan 2008r2. Saya memiliki skrip PowerShell yang saya tulis untuk menambal mesin lokal menggunakan objek com "Microsoft.Update". (Mirip dengan Windows Update PowerShell Remoting .) Skrip saya berfungsi secara lokal, tetapi saya ingin menggunakan fungsinya dari jarak jauh karena saya memiliki sejumlah server yang cukup untuk dikelola. Dalam hal itu jatuh (mirip dengan posting lain itu, yang tidak diselesaikan).

Namun saya dapat mempersempit kegagalan menjadi dua metode pada kelas tertentu.

(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()

Jika Anda menjalankan ini di PowerShell secara lokal sebagai admin, Anda tidak akan memiliki masalah. Jika Anda mencoba menggunakan perintah invoke (atau masuk sesi, atau winrs) Anda akan mendapatkan kesalahan berikut. (Ini sedang diuji dengan localhost, tetapi host mana pun akan melakukannya. Saya juga mencoba dengan metode otentikasi yang berbeda seperti credssp dan kerberos.);

PS C:\> Invoke-Command -ComputerName localhost -ScriptBlock { (New-Object -ComObject "microsoft.update.session").createUpdateDownloader()}
Exception calling "CreateUpdateDownloader" with "0" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005
 (E_ACCESSDENIED))"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

Saya telah melihat ini disebutkan di blog sebagai bug, tetapi tanpa cadangan untuk klaim itu. Ada dua solusi dan keduanya tidak membuat saya bahagia.

  • Gunakan psexec untuk menjalankan perintah sebagai pengguna sistem. PSExec adalah apa yang saya coba untuk tidak digunakan karena terbukti tidak dapat diandalkan. Saya juga ingin solusi PowerShell murni.
  • Buat tugas terjadwal dan katakan itu untuk menjalankan skrip Anda sebagai pengguna sistem. (melalui posnya ) Ini tidak hanya berantakan tetapi kemudian saya tidak akan mendapatkan hasil pembaruan. Saya harus masuk ke file atau memperbarui database atau sesuatu.

Saya terbuka untuk cara-cara lain untuk menjalankan pembaruan pada host dari jarak jauh karena ini tampaknya menjadi masalah yang banyak orang tolak.

Saya menemukan beberapa dokumen yang menjelaskan pesan tetapi bukan alasan atau solusinya.

Nilai Pengembalian Mengembalikan S_OK jika berhasil. Jika tidak, kembalikan kode kesalahan COM atau Windows.

This method can also return the following error codes.
Return code   Description
E_INVALIDARGA parameter value is invalid. 
E_ACCESSDENIED    This method cannot be called from a remote computer.

Bagaimana saya tahu saya menggunakan komputer jarak jauh?

pengintaian
sumber
Ini tampaknya jauh lebih kompleks daripada berdiri contoh WSUS dan pergi rute itu. Sudahkah Anda mempertimbangkan rute itu?
Driftpeasant
Anda tidak dapat mengontrol kapan server akan dibeli dan memastikan bahwa server akan kembali menggunakan WSUS saja. Kami memanfaatkannya untuk pembaruan itu sendiri. Saya akan tertarik jika Anda dapat memicu untuk melakukan itu sesuai permintaan.
Recbb
Saya memiliki masalah yang sama menggunakan PowerShell Web Access di Server 2012, di balik layar juga menggunakan PowerShell remoting. Kesalahan yang sama.
Peter Hahndorf
1
Kemungkinan jawabannya di sini serverfault.com/a/474031/23300
Nic
@reconbot saya tahu pertanyaan yang sangat lama tetapi saya juga menghadapi masalah. Apakah Anda punya cara memperbaiki atau alternatif?
Mesin Hitung

Jawaban:

0

Perintah seperti itu perlu dijalankan dengan hak istimewa di mesin jarak jauh, di mana kebutuhan itu harus dijalankan sebagai pengguna admin domain atau admin di mesin jarak jauh.

Jika Anda adalah kasus pertama, saya tidak punya bantuan, tetapi Anda hanya admin lokal, tidak jauh, gunakan get-credentialseperti ini.

$cred = get-credential

Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}

Formulir alternatif dan lebih langsung dibiarkan Invoke-Commandmeminta kredensial:

Invoke-Command -scriptblock {$ENV:username} -Credential ""
motobói
sumber
Saya menjalankan dengan kredensial akun admin, kesalahan menentukan "Metode ini tidak dapat dipanggil dari komputer jarak jauh."
Pengawas kembali
0

Saya dapat menjalankan ini dengan menyiapkan titik akhir JEA pada server jarak jauh untuk dijalankan sebagai akun virtual lokal.

Dari https://docs.microsoft.com/en-us/powershell/jea/session-configurations :

Akun Virtual Lokal

Jika peran yang didukung oleh titik akhir JEA ini semua digunakan untuk mengelola mesin lokal, dan akun administrator lokal cukup untuk menjalankan perintah dengan sukses, Anda harus mengonfigurasi JEA untuk menggunakan akun virtual lokal. Akun virtual adalah akun sementara yang unik untuk pengguna tertentu dan hanya berlangsung selama durasi sesi PowerShell mereka. Pada server anggota atau workstation, akun virtual milik grup Administrator komputer lokal , dan memiliki akses ke sebagian besar sumber daya sistem. Pada Pengontrol Domain Direktori Aktif, akun virtual milik grup Admin Domain domain.

jsmitty
sumber