Apa itu Windows PowerShell dan apa yang dimakannya? Bagian 5: Akses ke objek eksternal



Sistem operasi Windows mendukung berbagai infrastruktur objek. Anda dapat menggunakan antarmuka pemrograman aplikasi (API) untuk mengaksesnya, tetapi mengembangkan aplikasi lengkap tidak selalu dibenarkan. PowerShell memiliki cmdlet khusus yang memungkinkan Anda mengakses objek .NET, COM, WMI (CIM), dan ADSI secara interaktif. Pada bagian keempat dari seri ini, kami mempelajari dasar-dasarnya dengan fokus pada kelas .NET Core, dan sekarang kami ingin memperdalam topik dan memahami fitur interaksi PowerShell dengan objek eksternal.

Daftar Isi:


Bekerja dengan JSON, XML dan CSV
Bekerja dengan WMI dan CIM
Bekerja dengan objek COM
Bekerja dengan layanan direktori ADSI
Memformat output

Bekerja dengan JSON, XML dan CSV


Di skrip PowerShell, Anda sering harus mengurai data JSON, XML, dan CSV. Biasanya kebutuhan ini muncul ketika bekerja dengan layanan Internet atau dengan file konfigurasi. Beberapa administrator mencoba mem-parsing data menggunakan ekspresi reguler, tetapi tidak perlu membuat pengorbanan seperti itu: PowerShell memiliki cmdlet khusus untuk konversi, terlebih lagi, di kedua arah.



Format JSON memungkinkan Anda untuk menggambarkan berbagai objek dan, pada dasarnya, adalah hashtable yang dapat disarangkan. Konversi objek JSON ke objek .NET dengan PowerShell karenanya mudah. Karena layanan Internet biasanya memberikan garis yang sangat panjang alih-alih file yang diformat dengan indah, konversi ini juga dapat berguna untuk bekerja dalam mode interaktif. Dalam contoh di bawah ini, kami menggunakan variabel teks multiline untuk menggambarkan objek JSON:

$user = @"
{
   "firstName": "Ivan",
   "lastName": "Danko",
   "address": {
       "streetAddress": "Kremlin",
       "city": "Moscow"
   },
   "phoneNumbers": [
       "+7 495 1234567",
       "+7 499 1234567"
   ]
}
"@ | ConvertFrom-Json



Masalah terbalik diselesaikan dengan cara yang sama:

$file = Get-ChildItem C:\Windows\System32\notepad.exe
$file.VersionInfo | ConvertTo-Json



String format JSON yang dihasilkan mudah dikirim ke aplikasi lain melalui jaringan. Ini bisa berupa, misalnya, beberapa layanan tenang. Bekerja dengan cmdlet ConvertFrom-Csv, ConvertTo-Csv, dan ConvertTo-Xml dibangun dengan cara yang kira-kira sama, kami sarankan pembaca untuk mempelajarinya secara mandiri.

Untuk bekerja dengan XML dan CSV, kita perlu cmdlet lain:



Menggunakan alat-alat ini, Anda perlu memahami bahwa mengonversi objek biner ke format teks hanya menyimpan nilai propertinya, tetapi bukan metodenya. Mengubah data JSON, XML, atau CSV ke objek .NET menggunakan PowerShell hanya mungkin jika valid.

Bekerja dengan WMI dan CIM


Windows Management Instrumentasi (WMI) adalah implementasi standar WBEM (Web-Based Enterprise Management) yang dikembangkan oleh Microsoft dan diadaptasi oleh Windows. Ini didasarkan pada gagasan untuk menciptakan solusi universal untuk memantau lingkungan informasi yang didistribusikan dari suatu perusahaan dan mengelola komponen-komponennya. Struktur data WBEM, pada gilirannya, didasarkan pada Common Information Model (CIM), yang mengimplementasikan pendekatan berorientasi objek pada representasi sistem komputer. Pengembangan lebih lanjut dan dukungan WMI di Windows telah dihentikan, Microsoft merekomendasikan untuk menggunakan mekanisme serupa untuk mengelola infrastruktur - objek CIM. Untuk bekerja dengannya, cmdlet khusus muncul di PowerShell 3.0, yang akan kami pertimbangkan secara paralel dengan rekan-rekan WMI. Jika kode berisi panggilan cmdlet untuk bekerja dengan WMI, kode itu harus ditulis ulang jika memungkinkan.



Dalam kerangka model CIM (ini juga digunakan dalam WMI), data sistem operasi disajikan dalam bentuk kelas dengan properti dan metode. Kelas dikelompokkan dalam urutan hierarkis dan terkait secara logis oleh teknologi namespace atau area manajemen. Ada root namespace Root yang memiliki subruang: CIMv2, Default, Secutiry, dan WMI. Untuk identifikasi yang jelas dari instance kelas (objek) dan deskripsi status sumber daya yang sesuai, properti kelas digunakan, yang biasanya hanya-baca. Metode digunakan untuk mengelola sumber daya.

Instance kelas dapat diakses oleh path lengkap, yang memiliki bentuk berikut:

[\\ComputerName\NameSpace][:ClassName][.KeyProperty1=Value1][,KeyProperty2=Value2]…]

di mana
ComputerName adalah nama komputer;
NameSpace - namespace;
ClassName - nama kelas;
KeyProperty1 = Value1, KeyProperty2 = Value2 - properti objek dan nilai-nilai yang dengannya ia diidentifikasi.

Sebelum PowerShell, alat WMI sederhana tidak ada. Untuk mengakses objek, Anda harus menulis program yang agak rumit dalam bahasa tingkat tinggi (C ++, Visual Basic, Java Script) atau mempelajari shell WMIC (WMI Command Line, yang juga dihentikan) dengan bahasanya sendiri. Melalui PowerShell, objek WMI dapat diakses oleh pengguna rata-rata dari baris perintah atau dalam skrip. Pertama, sambungkan ke subsistem WMI dan dapatkan daftar kelas yang tersedia menggunakan cmdlet Get-WmiObject (alias gwmi). Untuk mendapatkan daftar kelas CIM, gunakan cmdlet Get-CimClass.

Get-CimClass
Get-WmiObject -List



Kami telah mendaftarkan kelas-kelas di komputer lokal, tetapi Anda dapat terhubung ke remote:

Get-CimClass -ComputerName IP- 
Get-CimClass -ComputerName _

atau

Get-WmiObject -ComputerName IP- -List
Get-WmiObject -ComputerName _ -List

Secara default, cmdlet Get-CimClass dan Get-WmiObject terhubung ke namespace Root \ CIMV2, yang menyimpan sejumlah besar kelas untuk mengelola sistem. Untuk mengubah namespace, gunakan parameter -Namespace:

Get-CimClass -Namespace Root
Get-WmiObject -Namespace Root -List

Mengetahui nama kelasnya, tidak sulit untuk mendapatkan contohnya. Perintah berikut mengembalikan semua instans dari Win32_Service, mis. layanan yang terdaftar di mesin lokal:

Get-WmiObject Win32_Service

Seperti jenis objek lainnya, daftar properti dan metode ditampilkan menggunakan Get-Member. Metode objek WMI dapat diakses secara langsung atau menggunakan cmdlet Invoke-WmiMethod. Anda juga bisa menggunakan cmdlet untuk objek WMI untuk mengurutkan, memfilter, mengelompokkan, dll.

Get-WmiObject Win32_Service | Get-Member



Untuk mendapatkan objek CIM (instance kelas), gunakan cmdlet Get-CimInstance. Tidak seperti WMI, objek CIM yang dihasilkan (objek yang dihasilkan atau instance kelas) tidak mengandung metode kelas. Karena Anda tidak dapat langsung mengekstrak metode, Anda harus menjalankan cmdlet Invoke-CimMethod. Pertimbangkan kelas Win32_Service - layanan yang berjalan pada sistem) dan instansnya untuk layanan spooler pada mesin lokal:

Get-CimInstance Win32_service -filter "Name='spooler'" 



Mari kita lihat struktur objek yang dihasilkan:

Get-CimInstance Win32_service -filter "Name='spooler'" | Get-Member



Pada titik ini, manfaat cmdlet untuk bekerja dengan objek CIM tidak jelas. Mereka terutama berhubungan dengan pekerjaan jarak jauh di lingkungan terdistribusi dan akan dibahas secara rinci dalam artikel terakhir dalam seri yang ditujukan untuk memecahkan masalah praktis administrasi.

Ada juga toolkit khusus WMI: WMI Query Language (WQL), bahasa query seperti SQL. Kueri WQL untuk mencari semua start-up ketika memulai sistem layanan terlihat seperti ini:

select * from win32_service where startmode="Auto"

Dari PowerShell, mereka dieksekusi sebagai berikut:

Get-WmiObject -Query 'select * from win32_service where startmode="Auto"'



Bekerja dengan objek COM


Untuk memastikan interaksi antara aplikasi di Windows, teknologi untuk menghubungkan dan menyematkan objek (Object Linking and Embedding atau OLE) dikembangkan. Kemudian, teknologi OLE Automation muncul, dengan bantuan aplikasi klien otomasi yang dapat memanggil fungsi aplikasi lain - server otomasi. OLE dan OLE Automation didasarkan pada teknologi inti dari Component Object Model (COM), yang menawarkan standar biner tunggal untuk komponen perangkat lunak. Objek yang dibuat menggunakannya dan terdaftar di sistem operasi dapat digunakan dalam aplikasi lain menggunakan file yang dapat dieksekusi atau perpustakaan dinamis.

Sekitar pertengahan tahun sembilan puluhan, alih-alih OLE, istilah lain mulai digunakan - ActiveX. Sebelum munculnya platform .NET, teknologi ActiveX dianggap penting, dan objek COM masih aktif digunakan untuk mengintegrasikan aplikasi ke dalam Windows - banyak produk Microsoft dan pihak ketiga adalah server otomatisasi dan menyediakan akses ke layanan mereka melalui mereka. Untuk mengakses objek, ProgID digunakan - pengidentifikasi simbolis yang diberikan kepada mereka ketika mendaftar di registri Windows. Ini memiliki bentuk berikut:

_..

Versi biasanya tidak ditunjukkan:

_.

Beberapa contoh ProgID yang tersedia adalah: InternetExplorer.Application (aplikasi Internet Explorer), Word.Application (aplikasi Microsoft Word), WScript.Shell (kelas Shell dari Windows Script Host atau model objek server script WSH).

Anda bisa membuat turunan objek menggunakan cmdlet Objek Baru yang dibahas dalam artikel sebelumnya , dan melihat strukturnya menggunakan Get-Member:

$myshell = New-Object -ComObject WScript.Shell
$myshell | Get-Member



Untuk bekerja dengan objek, properti dan metode digunakan. Katakanlah, untuk membuat pintasan di desktop pengguna, Anda perlu memanggil metode CreateShortcut ():

$link = $myshell.CreateShortcut("$Home\Desktop\Home.lnk")

Perhatikan bahwa pintasan juga merupakan objek COM:

$link | Get-Member



Tetap bagi kami untuk mengisi propertinya dan menyimpan:

$link.TargetPath = $Home
$link.Save()

Dengan cara ini, kami membuat pintasan di desktop pengguna aktif, dan sekarang kami akan menganalisis bekerja dengan layanan otomatisasi eksternal menggunakan contoh objek COM Shell.Application. Dengannya, Anda dapat mengotomatiskan beberapa tindakan di Windows Explorer:

$myshell=New-Object -ComObject Shell.Application

atau singkatnya:

$myshell=New-Object -com Shell.Application
$myshell | Get-Member



Objek Shell.Application memiliki beberapa metode manajemen jendela yang berbeda. Misalnya, untuk menampilkan konten direktori yang diberikan, Jelajahi () digunakan:

$myshell.Explore("c:\")

Sistem bantuan disebut menggunakan metode Bantuan ():

$myshell.Help()


Ada juga tiga metode untuk menjalankan dialog pencarian: FindFiles (), FindComputer (), dan FindPrinter ().

$myshell.FindFiles()
$myshell.FindComputer()
$myshell.FindPrinter()

Anda dapat membuka dialog peluncuran program menggunakan metode FileRun (), dan untuk memanggil jendela pengaturan tanggal / waktu, Anda memerlukan metode SetTime (). Ada, misalnya, metode untuk memanggil jendela pengaturan bilah tugas, elemen panel kontrol yang menunjukkan salah satu file cpl yang tersedia, untuk mengelola jendela terbuka:

$myshell.MinimizeAll()
$myshell.UndoMinimizeAll()
$myshell.TileHorizontally()
$myshell.TileVertically()

Metode Windows () memungkinkan Anda untuk mengakses kumpulan jendela terbuka di Explorer atau di Internet Explorer. Mari kita lihat properti dan metode yang tersedia untuk koleksi ini:

$myshell.Windows() | Get-Member



Ada objek COM lain yang bermanfaat, yang jumlahnya tergantung pada perangkat lunak yang diinstal dalam sistem. Sekali waktu, alat otomatisasi utama di Windows adalah server script WSH, model objek yang juga mencakup objek COM: dirancang untuk bekerja dengan fungsi jaringan WScript.Network dan WScript.Shell yang telah kami sebutkan. Yang terakhir tidak hanya membuat pintasan di desktop, dengan bantuannya Anda dapat, misalnya, menampilkan informasi jendela dengan pesan dan tombol, beralih di antara aplikasi, meluncurkan program atau mensimulasikan penekanan tombol.

Bekerja dengan Layanan Direktori ADSI


Secara umum, katalog mengacu pada sumber informasi di mana data tentang beberapa objek disimpan. Dengan layanan direktori, yang kami maksudkan adalah bagian dari sistem komputer terdistribusi yang memungkinkan Anda untuk mengakses dan memanipulasi objek yang disimpan. Layanan direktori dapat menggabungkan data tentang objek jaringan dan layanan yang memanipulasi mereka - ini merupakan titik masuk tunggal untuk berinteraksi dengan sumber daya jaringan. Mungkin ada banyak layanan seperti itu dalam jaringan komputer yang heterogen: SAM lokal (Manajer Akun Keamanan) untuk komputer non-domain, Direktori Aktif, dll.

Interaksi dengan layanan direktori yang berbeda memerlukan alat yang berbeda, yang menciptakan ketidaknyamanan tertentu. Dimulai pada Windows 2000, Microsoft telah memperkenalkan teknologi Active Directory Service Interface (ADSI) terpadu untuk sistem operasi yang tidak bergantung pada protokol akses jaringan tertentu. Untuk menemukan objek, namespace didefinisikan untuk direktori. Karena layanan direktori yang berbeda menggunakan metode penamaan yang berbeda, ADSI mendefinisikan konvensi yang secara unik mengidentifikasi objek apa pun. Konsep string pengikat dua bagian atau ADsPath diperkenalkan. Bagian pertama dari nama mendefinisikan layanan direktori (penyedia ADSI), dan yang kedua - lokasi objek dalam direktori. Berikut adalah contoh penunjukan penyedia ADSI yang berbeda:

LDAP: //digunakan untuk layanan direktori berbasis LDAP, termasuk untuk Direktori Aktif;

WinNT: // digunakan untuk komputer lokal.

Tidak ada cmdlet khusus untuk bekerja dengan ADSI di PowerShell. Sebagai gantinya, operator transmisi [ADSI] digunakan diikuti oleh tali pengikat. Misalnya, untuk terhubung ke pengguna Ivanov dari domain test.ru, konstruksi berikut diperlukan:

$user = [ADSI]"LDAP://CN=Ivanov,DC=TEST,DC=RU"

Untuk bekerja dengan akun lokal, Anda harus terhubung ke komputer dengan nama yang sesuai (untuk terhubung ke komputer lokal, cukup gunakan titik alih-alih nama):

$computer = [ADSI]"WinNT://."

Misalnya, buat pengguna baru, Ivanov, di mesin lokal:

$user = $computer.Create("user","Ivanov")
$user.Put("Description","  PowerShell")
$user.SetInfo()

Sekarang terhubung ke sana:

$user1 = [ADSI]"WinNT://./Ivanov,user"
$user1.Description



Pemformatan keluaran


Pekerjaan interaktif seringkali membutuhkan tampilan data. Di shell lain, perintah dan utilitas itu sendiri terlibat dalam memformat output, tetapi objek biner dikembalikan oleh fungsi dan cmdlet biasanya tidak tahu bagaimana melakukan ini. Di PowerShell, output diformat oleh empat cmdlet khusus yang memberi makan objek melalui pipa. Informasi lebih rinci dapat diperoleh dengan menggunakan Get-Help:

Format-Table memformat output dalam bentuk tabel yang kolomnya berisi nilai-nilai properti objek atau nilai yang dihitung. Kemampuan untuk mengelompokkan data didukung;

Format-Daftar menampilkan objek sebagai daftar properti, yang masing-masing ditampilkan pada baris baru. Kemampuan untuk mengelompokkan data didukung;

Format-kustommemformat output menggunakan tampilan kustom;

Format-Wide memformat objek dalam bentuk tabel lebar di mana hanya satu properti dari setiap objek ditampilkan.

Jika tidak ada cmdlet yang terdaftar dipanggil, modul pemformatan yang sesuai dengan jenis data yang ditampilkan digunakan. Aturan tampilan disimpan dalam file konfigurasi dalam format XML dengan ekstensi .ps1xml, yang terletak di direktori $ PSHome. Daftar mereka dapat diperoleh dengan menggunakan perintah berikut:

dir $pshome\*format*.ps1xm

Mengedit file konfigurasi secara manual tidak disarankan, lebih baik membuat sendiri dan memasukkannya ke dalam daftar file yang diunduh menggunakan cmdlet Update-FormatData. Jika formatter default untuk tipe yang Anda inginkan tidak ditentukan, PowerShell menampilkan properti objek pada layar dalam daftar.

Ini menyimpulkan deskripsi bekerja dengan objek di PowerShell, dan artikel terakhir dalam seri akan dikhususkan untuk memecahkan masalah praktis mengelola lingkungan informasi yang didistribusikan dari suatu perusahaan. Di dalamnya, semua alat yang dijelaskan bermanfaat bagi kita. Fokus utamanya adalah pada objek CIM dan perbandingannya dengan WMI. Bagian yang lalu dapat ditemukan di tautan di bawah ini.



1: Windows PowerShell
2: Windows PowerShell
3: ,
4: ,


All Articles