NSIS (Nullsoft Scriptable Install System): Get Microsoft-Windows-Foundation-Package Version


Microsoft-Windows-Foundation-Package Version diperlukan ketika akan mengaktifkan fitur-fitur Windows secara offline dengan melalui file .xmlSaya menghabiskan waktu yang cukup lama untuk mencari tahu bagaimana cara mendapatkan versi tersebut dan sempat berujung pada membaca registry dengan kode berikut:

ReadRegStr $WindowsProductVersion HKLM "SOFTWARE\Microsoft\DataAccess" "FullInstallVer"

Awalnya kode tersebut berjalan dengan lancar, tetapi masalah datang ketika Windows10 diluncurkan. Installer yang saya buat tidak dapat mengaktifkan fitur-fitur di Windows10 karena nilai registry tersebut ialah nomor versi Windows8.1. Saya tidak tahu apakah ini tergolong bug dari Windows10 atau memang nilai registry tersebut tidak diperbarui ketika pengguna langsung memperbarui Windows-nya ke Windows10. Percobaan berikutnya ialah menggunakan Image Version Number dari dsim.exe dengan kode berikut:

ExecWait '$WINDIR\System32\cmd.exe /c $WINDIR\System32\dism.exe /online /get-currentedition >$TEMP\currentedition.txt' $0
Push 5 ;line number to read from
Push "$TEMP\currentedition.txt" ;text file to read
Call ReadFileLine
Pop $0 ;output string (read from file.txt)
StrCpy $WindowsProductVersion $0
        
StrCpy $0 $WindowsProductVersion
StrCpy $1 0
loop:
    IntOp $1 $1 - 1
    StrCpy $2 $0 1 $1
    StrCmp $2 '~' found
    StrCmp $2 '' stop loop
found:
    IntOp $1 $1 + 1
stop:
    StrCpy $2 $0 "" $1

StrCpy $WindowsProductVersion $2
Push $WindowsProductVersion
Call Trim
Pop $WindowsProductVersion

Cara tersebut hanya dapat digunakan di Windows10. Mengapa? Ternyata di Windows10, Microsoft-Windows-Foundation-Package Version masih sama dengan Image Version Number (mungkin karena belum ada update apa-apa terkait Windows10). Tapi, cara ini tidak berlaku di Windows7/8. Sedikit panik karena installer saya kembali tidak berfungsi, akhirnya saya mencoba untuk mengambil nomor tersebut dari dsim.exe dengan menggunakan kode yang lain:

Var /GLOBAL WindowsProductVersion
Var /GLOBAL CodePage
ReadRegStr $CodePage HKLM "SYSTEM\CurrentControlSet\Control\Nls\CodePage" "OEMCP"
DetailPrint '..original encoding = $CodePage'
DetailPrint '..Execute dism.exe'
System::Call "Kernel32::Wow64EnableWow64FsRedirection(i 0)"
ExecWait '$WINDIR\System32\pkgmgr.exe /n:$TEMP\$IISXMLFile /l:$TEMP\IIS_Install_Log' $0
        
ExecWait '$WINDIR\System32\cmd.exe /c chcp 65001' $0
DetailPrint '..UTF-8 encoding = $0'
ExecWait '$WINDIR\System32\cmd.exe /c $WINDIR\System32\dism.exe /online /get-features >$TEMP\featurelist.txt' $0
DetailPrint '..IIS Feature list exit code = $0'
ExecWait '$WINDIR\System32\cmd.exe /c chcp $CodePage' $0
DetailPrint '..revert encoding = $0'

Push 7 ;line number to read from
Push "$TEMP\featurelist.txt" ;text file to read
Call ReadFileLine
Pop $0 ;output string (read from file.txt)
StrCpy $WindowsProductVersion $0
DetailPrint '..read line 7 = $WindowsProductVersion'

Push $WindowsProductVersion
Push "~"
Push "3"
Push "1"
Call StrTok
Pop $WindowsProductVersion
        
Push $WindowsProductVersion
Call Trim
Pop $WindowsProductVersion

Pada kode di atas, sebelum memanggil fungsi dsim.exe, saya menyimpan default code page PC kemudian mengubah code page command line menjadi UTF-8. Kalau hal ini tidak dilakukan, maka file .txt yang dihasilkan di PC yang menggunakan karakter non-latin (e.g. Chinese, Japanese, Korean, etc.) akan penuh dengan simbol-simbol aneh. Setelah mendapatkan daftar fitur yang bisa diaktifkan, langkah selanjutnya adalah membaca baris ke-7 dari file .txt, parsing, dan jangan lupa untuk melakukan trim. Untuk fungsi StrTok dapat dilihat di sini sedangkan fungsi Trim dapat dilihat di sini.

Sekian info mengenai Microsoft-Windows-Foundation-Package Version yang cukup membuat pusing (tulisan ini sekaligus berfungsi sebagai dokumentasi kalau-kalau saya harus berhadapan dengan hal yang sama di masa mendatang). Jika ada yang memiliki solusi lebih mudah, silahkan tulis di bagian komentar ya😀

再見!

signatureblack

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s