Belajar PowerShell - COM Objects & .NET Integration
Episode 17 of 31

Belajar PowerShell - COM Objects & .NET Integration

Lewati batas PowerShell: akses framework .NET secara langsung, otomasi aplikasi desktop seperti Excel lewat COM objects, dan tambahkan logika kustom dengan kode C Sharp inline lewat Add-Type.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Di episode 16 kalian mengakses repositori informasi sistem lewat CIM. Tapi data di luar sistem operasi — file, jaringan, tanggal, enkripsi, hingga aplikasi desktop — juga bisa dijangkau. Rahasianya: PowerShell dibangun di atas .NET, dan setiap baris kode yang kalian tulis sebenarnya sedang berdiri di atas fondasi itu.

Episode 17 membuka dua pintu: .NET integration — memanggil tipe dan metode .NET secara langsung, dari System.IO hingga System.Security.Cryptography — dan COM objects — mengotomasi aplikasi desktop seperti Excel dan Word. Di akhir, kalian akan menyuntikkan kode C# sendiri dengan Add-Type.

Membuka Pintu ke .NET

PowerShell dibangun di atas .NET — setiap string, angka, atau objek yang kalian pegang adalah objek .NET. Akses ke .NET menggunakan type literal: nama tipe di dalam tanda kurung siku, misal [System.Math], [System.IO.File], atau [System.DateTime].

Pola dasar: metode statis dipanggil dengan dua titik dua setelah nama tipe. Metode statis tidak butuh instance — dipanggil langsung dari tipe:

Memanggil metode statis .NET
[System.Math]::Max(5, 10)
[System.DateTime]::Now
[System.Math]::Round(3.14159, 2)

[System.DateTime]::Now mengembalikan waktu saat ini; [System.Math]::Round membulatkan angka. Keduanya langsung dipanggil dari tipe tanpa membuat objek. Ini bedanya dengan metode instance yang beroperasi pada sebuah objek:

Metode instance .NET
$tanggal = [System.DateTime]::Now
$tanggal.AddDays(7)

$tanggal adalah instance; AddDays adalah metode yang beroperasi pada instance tersebut. Dua pola inilah fondasi seluruh integrasi .NET: statis untuk utilitas, instance untuk objek.

Namespace yang Wajib Dikenal

.NET diorganisasi dalam namespace — folder konseptual berisi tipe terkait. Beberapa yang paling sering dipakai:

NamespaceFungsi
System.IOFile, folder, stream
System.DateTimeTanggal dan waktu
System.NetJaringan, HTTP
System.Security.CryptographyEnkripsi dan hash
System.Text.RegularExpressionsRegex tingkat lanjut

Praktik singkat per namespace:

System.IO - baca dan tulis file
[System.IO.File]::ReadAllText("/etc/hosts")
[System.IO.File]::WriteAllText("/tmp/hello.txt", "Halo dari PowerShell")
System.Net - unduh konten web
[System.Net.WebClient]::new().DownloadString("https://contoh.com/data")

Perhatikan pola [System.Net.WebClient]::new() — cara PowerShell memanggil konstruktor .NET. Untuk tipe yang dikonstruksi dengan parameter, tambahkan argumen di dalam tanda kurung.

Membuat Objek .NET

Kebanyakan tipe .NET harus dibuat instance-nya sebelum dipakai. Ada dua cara: konstruktor dengan ::new() (PowerShell 5+), atau cmdlet New-Object:

Dua cara membuat instance
$hasil1 = [System.Text.StringBuilder]::new()
$hasil2 = New-Object System.Text.StringBuilder

StringBuilder adalah objek untuk menyusun string secara efisien — analogi menempelkan stiker satu per satu ke buku, daripada menulis ulang seluruh buku setiap kali. Bandingkan kecepatan menggabungkan ribuan string dengan operator += versus StringBuilder; perbedaannya drastis.

COM Objects: Otomatisasi Aplikasi Desktop

COM (Component Object Model) adalah teknologi Windows yang memungkinkan skrip "mengemudikan" aplikasi: Excel, Word, Outlook. Melalui New-Object -ComObject, kalian membuat instance aplikasi dan mengontrolnya dari PowerShell.

Membuat file Excel dari PowerShell
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$buku = $excel.Workbooks.Add()
$sheet = $buku.Worksheets.Item(1)
$sheet.Cells.Item(1,1) = "Nama"
$sheet.Cells.Item(1,2) = "Skor"
$sheet.Cells.Item(2,1) = "Arman"
$sheet.Cells.Item(2,2) = 95
$buku.SaveAs("C:\tmp\laporan.xlsx")
$buku.Close()

Ini bekerja karena Excel mengekspos antarmuka COM. $excel.Visible = $false membuat aplikasi berjalan tanpa menampilkan jendela — mode otomasi yang umum untuk menghasilkan laporan. Untuk Word, polanya serupa: New-Object -ComObject Word.Application lalu $word.Documents.Add().

Melepas COM Object

COM object adalah sumber daya yang wajib dilepas — seperti meminjam mobil operasional: selesai dipakai harus dikembalikan, jika tidak denda menumpuk (di sini: proses aplikasi yang menggantung di memori).

Melepas COM object dengan aman
$excel = New-Object -ComObject Excel.Application
try {
    $buku = $excel.Workbooks.Add()
    $buku.SaveAs("C:\tmp\laporan.xlsx")
    $buku.Close()
}
finally {
    $excel.Quit()
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
    [GC]::Collect()
    [GC]::WaitForPendingFinalizers()
}

Marshal.ReleaseComObject menurunkan penghitung referensi COM; ketika mencapai nol, objek dibebaskan. Pemanggilan [GC]::Collect dan [GC]::WaitForPendingFinalizers memastikan resource benar-benar dikembalikan ke sistem. Pola finally ini persis pelajaran episode 12: pembersihan dijamin berjalan apa pun yang terjadi.

Warning

Lupa melepas COM object menyebabkan proses aplikasi menggantung di memori. Excel yang dibuat lewat skrip dan tidak dilepas akan tertinggal sebagai proses EXCEL.EXE di Task Manager — dan menumpuk di setiap eksekusi skrip. Selalu lepas dalam blok finally dan panggil $app.Quit() bila tersedia.

Regex dan Kriptografi lewat .NET

PowerShell punya operator -match, tapi untuk pekerjaan regex tingkat lanjut — matching global, grup bernama, penggantian kompleks — [System.Text.RegularExpressions.Regex] jauh lebih kuat:

Regex .NET dengan pola kelompok
$pola = [System.Text.RegularExpressions.Regex]::Match(
    "IP server: 10.0.0.42",
    "(\d+\.){3}\d+"
)
$pola.Value

Untuk kriptografi, [System.Security.Cryptography] menyediakan fungsi hash dan enkripsi bawaan. Contoh menghitung hash SHA256 sebuah file:

Hash SHA256 sebuah file
$sha = [System.Security.Cryptography.SHA256]::Create()
$stream = [System.IO.File]::OpenRead("/etc/hosts")
$hash  = $sha.ComputeHash($stream)
$stream.Close()
($hash | ForEach-Object { $_.ToString("x2") }) -join ""

Hash adalah jejak digital sebuah file: dua file identik menghasilkan hash yang sama persis. Memverifikasi checksum unduhan atau mengaudit integritas file adalah penggunaan paling umum pola ini.

Add-Type: Menulis Kode .NET Sendiri

Jika built-in .NET belum cukup, Add-Type -TypeDefinition menyuntikkan kode C# langsung ke sesi. Setelah dikompilasi, kode itu bisa dipanggil seperti tipe .NET lain:

Definisi kode C# inline
Add-Type -TypeDefinition @"
using System;
public class Kalkulator {
    public static int Kali(int a, int b) {
        return a * b;
    }
}
"@
 
[Kalkulator]::Kali(6, 7)

Add-Type menerima here-string berisi kode C#, mengompilasinya saat itu juga, dan mendaftarkan tipe ke sesi. [Kalkulator]::Kali memanggil metode statis C# persis seperti tipe .NET asli. Ini berguna ketika logika memerlukan fitur C# yang tidak nyaman di PowerShell — misalnya algoritma performa tinggi atau struktur data kompleks.

Tip

Mulailah dari tipe .NET bawaan sebelum menulis C# sendiri. Kebutuhan yang tampak kompleks — parsing tanggal, hash file, manipulasi JSON — sering sudah dijawab oleh [System.DateTime], [System.Security.Cryptography], atau [System.Text.Json]. Tulis kode C# hanya ketika solusi bawaan memang tidak ada atau terlalu lambat.

Penutup

Episode ini melepas batas bahasa: kalian kini memanggil metode statis dan instance .NET lewat type literal, mengenal namespace inti dari System.IO hingga System.Security.Cryptography, membuat instance objek dengan ::new() dan New-Object, mengotomasi Excel dan Word melalui COM dengan pelepasan resource yang disiplin, serta menambahkan logika kustom dengan Add-Type dan kode C# inline.

Poin kunci yang dibawa pulang:

  • [Tipe]::Metode untuk statis; ::new() atau New-Object untuk instance.
  • Namespace inti: System.IO, System.Net, System.Security.Cryptography, dan lainnya.
  • COM object wajib dilepas dengan Marshal.ReleaseComObject di dalam finally.
  • Add-Type -TypeDefinition menyuntikkan kode C# ke sesi.
  • Utamakan tipe bawaan .NET sebelum menulis kode kustom.

Dengan .NET dan COM, PowerShell nyaris tidak punya batas — apa pun yang bisa dilakukan aplikasi Windows, bisa dilakukan dari skrip. Episode 18 menerapkan semua fondasi yang sudah kalian bangun ke domain paling penting di dunia Windows enterprise: Active Directory ManagementGet-ADUser, New-ADUser, mengelola group, dan menulis laporan direktori. Sampai jumpa di episode 18!

Belajar PowerShell - COM Objects & .NET Integration | Belajar PowerShell