Nvm-windows: nvm harus dapat berjalan tanpa hak admin

Dibuat pada 13 Jun 2019  ·  19Komentar  ·  Sumber: coreybutler/nvm-windows

Saya menginstal nvm kemarin di mesin di mana saya tidak memiliki hak admin. Saya memutuskan untuk jalur terpisah untuk nvm dan npm daripada jalur Windows standar sehingga saya dapat mengatasi kebutuhan akan hak admin.

nvm dapat mengunduh versi, tetapi proses symlink tidak berfungsi, meskipun saya dapat membuat tautan secara manual dengan mklink tanpa masalah.

Saya memutuskan untuk memeriksa kode, dan mengubah file elevate.cmd menjadi ini:

<strong i="8">@setlocal</strong>
<strong i="9">@echo</strong> off
set CMD=%*
set APP=%1
start %CMD%

Versi file ini sekarang bekerja tanpa hak admin dan melakukan tugasnya. Akan sangat bagus untuk dapat mengonfigurasi ini di settings.txt dengan beberapa tanda, sehingga orang yang menginstal di jalur yang berbeda dapat bekerja tanpa hak admin.

wontfix

Komentar yang paling membantu

@ChrisKader Anda hanya harus mempublikasikan skrip Anda sebagai alat terpisah.

Semua 19 komentar

Ada kemungkinan lingkungan Anda memberikan hak yang sesuai, tetapi secara default, akun pengguna harus menjadi bagian dari grup Adminstrator untuk menggunakan mklink . Lihat https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links.

Apakah ada alasan untuk menggunakan mklink sebagai pengganti variabel lingkungan akun pengguna lokal? Jika mklink gagal, file hanya bisa disalin. Beralih, dan direktori bukan tautan, meminta untuk menyalin kembali perubahan.

https://unix.stackexchange.com/questions/96907/how-do-i-check-if-a-file-is-a-symbolic-link-to-a-directory

Ini tidak sesederhana hanya menyalin node.exe . Root instal berisi (secara default) direktori global node_modules dan sejumlah skrip lainnya. Jadi, _semua_ itu perlu disalin/dibersihkan, atau konfigurasi klien npm perlu diperbarui untuk mengidentifikasi lokasi direktori global node_modules .

Menyalin membutuhkan banyak waktu dan menciptakan churn sistem file yang luar biasa ketika Anda telah memetakan/drive jaringan atau profil roaming. Intinya: tidak ada jaminan bahwa file benar-benar akan disimpan di hard drive lokal. Mereka bisa berada di NAS/SAN/dll. Belum lagi, tidak jarang melihat modul node senilai gigabyte di setiap versi yang diinstal, jadi bahkan menyalin pada hard drive lokal bisa memakan waktu cukup lama.

Mengingat berapa banyak versi npm yang berbeda (belum lagi itu adalah alat yang didukung secara komersial), memanipulasi lingkungan npm untuk memahami di mana direktori global node_modules berada di luar cakupan proyek ini. Plus, ada juga benang yang perlu dipertimbangkan.

Variabel lingkungan lokal digunakan. PATH berisi jalur symlink. Bukan ide yang baik untuk memodifikasi PATH lebih dari yang diperlukan (yang masih memerlukan hak admin). Jika ada kesalahan atau kesalahan selama proses, seluruh PATH dapat di-nuked (saya mencoba ini di hari-hari awal NVM4W). Namun; adalah mungkin untuk mengubah tujuan symlink, sehingga tidak perlu memodifikasi variabel lingkungan PATH. Itu sebabnya mklink digunakan.

Jadi drive jaringan tidak didukung dan flash drive Fat32 tidak dapat didukung (tidak mendukung mklink). Prompt yang menanyakan apakah Anda benar-benar ingin menyalin file akan menyelesaikan masalah "file churn". Pengguna dapat masuk ke mode admin. Atau mereka dapat memilih untuk mengajukan churn. Atau batal.

Jika Anda menyalin file, jalur tidak perlu mengatur jalur itu lebih dari sekali. Dan powershell mungkin dapat mengubah jalur lingkungan pengguna saat ini (bukan sistem) tanpa hak admin. Dan, jika jalur itu di-nuked, jalur sistem akan tetap aman. Tampaknya jauh lebih tidak berbahaya.

Itu akan membutuhkan beberapa percobaan. Saya akan mencobanya di tempat kerja saat istirahat atau makan siang. Saya telah beralih ke Linux di rumah.

Melakukan penelitian lebih lanjut: "Setiap pengguna Windows 10 dengan Mode Pengembang diaktifkan akan dapat membuat symlink menggunakan mklink". Itu juga bisa menjadi jawaban yang mungkin. Yakinkan orang-orang di tempat kerja bahwa saya seorang pengembang dan perlu mengaktifkan mode pengembang.

Pertanyaannya, apakah mode admin diperlukan jika mode pengembang diaktifkan?

Saya tidak dapat menjawab secara otoritatif apakah mode pengembang akan meniadakan kebutuhan akan hak istimewa admin. Dugaan saya ya. Namun; operasi apa pun yang menyentuh C:\Program Files memerlukan hak istimewa admin (kecuali mode pengembang juga mengabaikan batasan itu).

Drive jaringan didukung dengan mklink saat digunakan sebagai persimpangan. ROI penggunaan junction sudah banyak yang bolak-balik, jadi belum pernah diimplementasikan.

Ingat, Powershell tidak dijamin tersedia di semua lingkungan.

Saya tidak secara eksplisit menentang pendekatan penyalinan file, selama itu a) di belakang prompt flag/CLI dan b) tidak memerlukan antarmuka visual. Bagian terakhir itu penting, karena ada sejumlah layanan CI tanpa kepala yang menggunakan ini.

Mengapa saya cenderung menginstal alat pengembangan c:\programs\ (tidak ada hak admin dan tidak ada spasi di jalur). c:\programs\nvm dan konfigurasikan node untuk menginstal ke c:\programs\nodejs.

powershell.exe -command '[Environment]::SetEnvironmentVariable("PATH",[Environment]::GetEnvironmentVariable("PATH","User")+"c:\programs\nvm","User")' || XSET PATH "%PATH%;c:\programs\nvm"
Tampaknya bekerja dengan baik? xset sepertinya berfungsi juga (harus menunggu beberapa menit sebelum muncul dengan xset)? Saya telah mematikan UAC pada pc windows yang saya gunakan sekarang. Besok, di tempat kerja, saya akan memeriksanya.

tl; dr https://github.com/PowerShell mendukung Linux (bukan berarti saya akan menggunakannya di sana). Jadi saya tidak dapat memikirkan lingkungan yang tidak dapat didukung oleh PowerShell yang juga tidak dapat didukung oleh nvm. node dan PowerShell keduanya menjalankan skrip. Tidak ada sertifikat penandatanganan yang diperlukan dan dipanggang untuk simpul untuk memvalidasi skrip itu sah dan belum dirusak. Powershell memiliki ini. audit npm bersifat reaktif. imho, node belum siap server jika Anda membutuhkan keamanan penuh. Namun, kebanyakan orang tidak. Proxy cukup baik.

Ada kemungkinan lingkungan Anda memberikan hak yang sesuai, tetapi secara default, akun pengguna harus menjadi bagian dari grup Adminstrator untuk menggunakan mklink . Lihat https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links.

Membuat symlink tidak memerlukan akses admin lagi mulai dari Windows 10 Build 14972 , terlebih lagi Anda dapat menggunakan Junction alih-alih symlinks untuk menautkan, sehingga dapat berfungsi tanpa hak admin saat membuat symlink di ruang pengguna seperti C:\Users\<user> . Menyentuh C:\Program Files masih memerlukan hak admin.

Pertanyaan saya adalah mengapa tidak membuat nvm-windows jauh dari hak admin secara default , dan jika satu pengguna mencoba melakukan sesuatu dengan C:\Program Files atau jalur lain yang memerlukan hak admin, maka lakukan peningkatan izin, alih-alih meminta admin hak di mana-mana.

Kepada @mschmiedel Jika Anda ingin menggunakan nvm-windows tanpa hak admin, saya memiliki garpu ( release ) untuk Anda, tetapi tidak dapat menangani Node.js di seluruh sistem (saya tidak mengujinya, mungkin berfungsi di bawah prompt yang ditinggikan).

terkait dengan #79 #383

@ h404bi mengapa tidak mempertahankan elevasi admin (saya tidak berpikir elevate.vbs / .bat tidak boleh dikosongkan). Tetapi hanya menjalankan elevasi admin ketika persimpangan gagal dan coba lagi selesai? Satu-satunya alasan itu harus gagal adalah karena izin gagal. Seperti node atau nvm yang diinstal ke c:\program files. Jika tidak, permintaan tarik terlihat menjanjikan (hanya dengan melihat perbedaannya).

https://github.com/tamusjroyce/nvm-windows - upaya saya untuk itu. Tapi saya belum pernah menyentuh golang. Saya cukup yakin ini akan hancur dan terbakar. bin/install.cmd juga (walaupun saya tidak mengerti bagaimana cara meng-unzip arsip yang ada di dalamnya?). Tidak yakin mengapa git saya merusak binari. Tetapi peringatan yang adil (paling baik jika binari dipisahkan dari kontrol sumber).

Saat menginstal, panggil skrip instal secara rekursif dengan elevate.cmd jika izin menulis ke NVM_PATH gagal.
echo "Periksa apakah jalur nvm memerlukan penulisan admin untuk membuat file" > %NVM_PATH%\checkpermissions.txt || elevate.cmd install.cmd %NVM_PATH%

https://github.com/tamusjroyce/nvm-windows/commit/7cde75d0ef375cc68c763404b4b3f20b99bbee52

@h404bi Satu-satunya keraguan saya dengan berpindah dari hak admin secara default adalah jumlah pengguna yang dapat memanfaatkan ini masih sedikit, untuk saat ini. Namun; waktu berubah, dan saya tentu tidak keberatan untuk tidak meminta hak istimewa admin. Selama pengalaman pengguna tidak menurun, itu adalah sesuatu yang saya lihat sebagai langkah maju yang bagus.

Yang mengatakan, masih perlu ada bendera untuk menggunakan persimpangan. Ini sudah ada di daftar tugas saya untuk waktu yang sangat lama sekarang. Ini harus menjadi opsi konfigurasi... yang mengarah ke tantangan yang lebih besar. Saya sudah lama ingin menyingkirkan file settings.txt sejak rilis awal. Saya telah bereksperimen dengan pendekatan SQLite, yang bekerja dengan baik di aplikasi lain yang saya buat, tetapi belum siap untuk NVM4W.

Saya akan melihat garpu sesegera mungkin. Saya tidak yakin kapan saya akan punya waktu. Sementara itu, cara terbaik untuk menggabungkan sesuatu adalah memastikannya berfungsi setidaknya kembali melalui Win 8.1.

Ada beberapa cara untuk membuat mklink berfungsi tanpa menjadi admin (hingga memberikan SeCreateSymbolicLinkPrivilege secara eksplisit).
Mengapa tidak mencoba menjalankannya dan hanya jika gagal coba lagi dengan ketinggian?

Sangat menjengkelkan untuk memasukkan kredensial pengguna admin lokal dua kali untuk setiap perubahan node ...

Satu-satunya keraguan saya dengan berpindah dari hak admin secara default adalah jumlah pengguna yang dapat memanfaatkan ini masih sedikit, untuk saat ini.

Saya menginstal nvm menggunakan manajer paket sendok . Sendok paket instal default ke ~/.scoop . Saat ini, menginstal nvm menggunakan permintaan sendok untuk hak admin. Akan menyenangkan untuk memperbaiki ini.

Saat ini saya memiliki skrip PowerShell (Ini telah berkembang pesat) yang saya buat untuk digunakan oleh saya sendiri dan pengembang lain di tempat kerja (sekitar 200 orang atau lebih). Saya menyebutnya "PNM: PowerShell NodeJS Manager". Ini dibuat sebagai hasil dari pergeseran industri di mana lingkungan pengembang lebih aman dan sebagai akibatnya pengembang tidak memiliki akses admin (Jika mereka melakukannya, biasanya akunnya berbeda). Saya juga sangat yakin bahwa program tidak boleh dijalankan dengan hak istimewa yang lebih tinggi kecuali benar-benar diperlukan (terlepas dari apakah pengguna memiliki hak admin atau tidak). Ketika saya perhatikan bahwa nvm tidak memerlukan hak istimewa yang lebih tinggi pada platform lain (Linux, OS X, dll) saya mulai membuat solusi yang akan bekerja sama di Windows.

Meskipun benar bahwa Windows 10 tidak lagi memerlukan hak admin untuk membuat/memodifikasi symlink, itu TIDAK mengharuskan sistem berada dalam "mode pengembang" (yang memerlukan hak admin untuk mengaktifkannya). Setiap lingkungan di mana pengembang tidak memiliki hak admin mungkin tidak memiliki workstation mereka dalam "mode pengembang".

Dengan demikian, skrip PowerShell ini memanfaatkan env vars pengguna.

Script melakukan hal berikut:

  • Tidak setiap sakelar dan detail persisnya terdaftar.

    • Skrip PS ini telah berkembang selama bertahun-tahun untuk memberikan BANYAK opsi penyesuaian

  • Menjalankan "pnm ins v10.0.1 productZ [dft] [node-gyp,nextGlobalPackage,nextGlobalPackage2]" akan

    • Unduh dan ekstrak nodeJS versi 10.0.1 dan letakkan di foldernya sendiri dengan subdirektori nodejs.

    • Beri nama folder v10.0.1_productA dan izinkan penggunaan nama instance atau versi node



      • “pnm gunakan produkZ”


      • "pnm gunakan v10.0.1"


      • Jika ada lebih dari satu instance 10.0.1, itu akan menggunakan salah satu yang ditandai sebagai default saat diinstal.


      • Jika tidak ada default yang ditentukan, pengguna akan diminta untuk memilih instance mana



    • Instal "node-gyp", "nextGlobalPackage", dan "nextGlobalPackage2" ke dalam folder global node_modules instance tertentu.

    • Perbarui file konfigurasi dengan info instance dan modul yang diinstal.

    • Jika konflik, pengguna akan dipromosikan untuk menyelesaikan.

  • “pnm sync [kering] produkZ [>|=] produkA”

    • kering



      • Akan memberikan daftar perubahan berdasarkan parameter yang diberikan tetapi TIDAK akan membuat perubahan (non-destruktif)



    • >



      • Ini akan “npm install” semua modul global yang dipasang di instans “productZ” ke dalam instans “productA”.


      • TIDAK akan menghapus modul dari productA yang tidak ada di productZ



    • =



      • Akan menyinkronkan productA dengan modul yang dipasang di productZ


      • AKAN MENGHAPUS semua modul dari productA yang tidak ada di productZ



    • <=



      • Kebalikan dari di atas.



  • “pnm rst [full|mods] productZ”

    • Perintah akan memperbarui file konfigurasi dengan pembaruan terbaru ke folder node_modules sebelum dijalankan di bawah ini.

    • penuh



      • akan menghapus seluruh direktori dan mengunduh ulang (atau menggunakan versi cache) nodeJS dan menginstal modul



    • mod



      • rmdir -rf folder node_modules dan instal ulang dari daftar di konfigurasi



  • “pnm ls rmt”

    • Buat daftar versi nodeJS (dan npm) yang tersedia untuk diunduh DAN dipasang



      • Akan memeriksa pembaruan dan mengunduh atau menggunakan file di folder cache.



  • “pnm ls lcl”

    • Daftar versi nodeJS yang tersedia untuk diinstal (sudah diunduh)

  • "pnm cfg sys [mgt 'C:\'] [cln] [simpan]"

    • Memerlukan hak admin

    • Mengatur PNM untuk digunakan dalam sistem env var

    • Menghapus PNM env vars dari tingkat pengguna

    • Memperbarui PNM env vars di tingkat sistem

    • Menggunakan migrasi dan menyediakan jalur akan memindahkan folder .pnm ke jalur

    • Menentukan clean akan membuat folder .pnm di path, mengatur struktur folder dan menyalin config.json.

    • Kemudian akan menginstal setiap instance berdasarkan file config.json

    • Setelah selesai dan diverifikasi, folder .pnm yang lama akan dihapus, kecuali jika bendera simpan ditentukan

  • “pnm cfg usr [nama pengguna]”

    • Membutuhkan admin

    • Mengembalikan perubahan yang dibuat untuk konfigurasi tingkat sistem dan menerapkannya ke nama pengguna yang ditentukan atau pengguna saat ini jika tidak ditentukan.

  • “pnm init [sys|usr] [nama pengguna]”

    • Bendera init dapat digabungkan dengan jalur ke file config.json yang ada

    • Akan diatur untuk nama pengguna yang ditentukan (Jika pengguna memiliki akses).

    • Instalasi PNM kemudian akan dikonfigurasi seperti yang dijelaskan dalam file konfigurasi



      • Ini termasuk menyiapkan setiap instance dalam file (dan menginstal semua modul global di folder instance node_modules).



    • Membuat folder bernama “.pnm” di %USERPROFILE%



      • config.json





        • Berisi pengaturan default untuk semua pemicu (contoh di bawah)



        • lengkungan: x86 atau x64



        • chcDir



        • Dapat berupa direktori yang dapat dibaca dan/atau ditulis oleh pengguna



        • Memungkinkan Anda membuat jaringan berbagi yang berisi semua pemasangan nodeJS untuk digunakan oleh siapa pun, sebagai contoh



        • Jika pengguna tidak memiliki akses tulis, direktori akan digunakan untuk menginstal versi apa pun yang ditentukan





      • alwsNew: benar atau salah





        • Akan selalu membuat instance nodejs baru ketika versi yang diinstal sudah ada



        • Jika tidak ada nama instance yang diberikan, itu terus bertambah 1.





      • instMap: benar atau salah





        • Mengontrol apakah pemetaan instans diperbarui dalam file konfigurasi saat instans diinstal atau dikonfigurasi.



        • Ini memungkinkan setiap instalasi instance disimpan ke file konfigurasi saat mendokumentasikan



        • versi nodeJS



        • versi npm



        • modul terpasang



        • Ini diperbarui oleh pengguna yang menjalankan "pnm updMap"



        • Ini memberi pengguna titik pusat yang berisi semua konfigurasi instans mereka untuk memudahkan pencadangan dan/atau penginstalan ulang nanti.



        • Bekerja mirip dengan package.json dalam proyek nodeJS



        • Pengguna dapat membuat node kedua bernama "userOverrides" yang memungkinkan mereka untuk mengganti default dengan nilai yang mereka inginkan.





      • nodejs





        • Folder ini berisi setiap instance nodejs



        • Struktur penamaan: “v[Versi nodeJS]_[Nama Instance NodeJS]



        • Sementara PNM memungkinkan pengguna untuk menginstal beberapa versi NodeJS, memungkinkan mereka untuk juga menginstal banyak salinan dari versi yang sama.



        • Ini memungkinkan pengguna untuk melakukan banyak hal kreatif tetapi juga memungkinkan mereka untuk menggunakan nama atau versi saat bertukar



        • “pnm gunakan acmeInstance”



        • Bertukar ke sebuah instance dengan nama "acmeInstance"



        • “pnm gunakan v10.0.1 acmeInstance”



        • Bertukar ke instance dengan nama "achmeInstance" DAN nodeJS versi 10.0.1





      • cache





        • Folder ini berisi versi cache dari https://nodejs.org/download/release/index.json



        • Ketika “pnm list avl” dijalankan, PNM memasukkan pembuatan\time file index.json ke dalam header “If-Modified- Since” dari permintaan web.



        • Jika nodejs.org membalas dengan 304, itu berarti file belum diperbarui dan PNM menggunakan nilai dalam JSON yang disimpan.



        • Jika sudah diupdate, balasan kembali akan berisi JSON.



        • Ini secara dramatis mengurangi pemanfaatan bandwidth dan membuat pengalaman pengguna menjadi lebih lancar.



        • Jika ditentukan dalam file config.json, ini juga akan berisi folder dengan setiap file ZIP versi nodeJS yang diunduh.





      • pnm.ps1





        • Skrip PowerShell utama






    • Membuat env var pengguna bernama "PNM" dan "PNMNJS"

    • PNM menunjuk ke direktur .pnm di folder profil pengguna.

    • PNMNJS menunjuk ke instance nodeJS yang saat ini dipilih.



      • Pengguna env var ini diperbarui ke jalur instance yang ditentukan saat "pnm use" dijalankan.



    • Menempatkan var PNM dan PNMNJS baru di awal env pengguna PATH

    • Memperbarui profil PowerShell pengguna untuk menyertakan skrip PowerShell PNM utama.

Saya akan dengan senang hati membantu memasukkan perubahan ini ke versi nvm Anda, jika Anda tertarik.

@h404bi @coreybutler Saya tidak yakin mengapa "symlink tidak lagi memerlukan hak admin" terus diulang. Ini mengharuskan Anda untuk berada dalam "Mode Pengembang", yang memerlukan hak admin untuk mengaktifkannya.

Pengguna dapat diberikan akses untuk membuat symlink dengan izin tetapi tetap tidak mengizinkan pembuatan symlink di direktori terbatas (seperti file program) tanpa akses admin.

@h404bi @coreybutler Saya tidak yakin mengapa "symlink tidak lagi memerlukan hak admin" terus diulang. Ini mengharuskan Anda untuk berada dalam "Mode Pengembang", yang memerlukan hak admin untuk mengaktifkannya.

Pengguna dapat diberikan akses untuk membuat symlink dengan izin tetapi tetap tidak mengizinkan pembuatan symlink di direktori terbatas (seperti file program) tanpa akses admin.

Sambungan NTFS TIDAK memerlukan hak admin/Mode Pengembang. Anda dapat mundur untuk menggunakan persimpangan saat mendeteksi itu tidak dalam mode dev di Windows 10.

Saya mengetahui Persimpangan NTFS tetapi saya tidak melihatnya disebutkan atau ditautkan di utas ini. Padahal, saya membaca sekilas dengan cepat. Ini konsep yang menarik tetapi eksperimen menghasilkan NTFS Junctions yang tidak kompatibel lintas platform dan tidak berfungsi dengan baik dengan berbagi jaringan. Keduanya membutuhkan kasus penggunaan untuk lingkungan saya.

Alasan utama saya lebih suka menambahkan %PNMNJS% ke jalur pengguna dan memperbarui env var adalah karena SANGAT mudah untuk diterapkan (dan diperhitungkan) di seluruh lingkungan (Skrip saya mendukung OSX dan Linux melalui PowerShell Core) dan karena variabel lingkungan dapat bersarang ke orang lain, saya tidak perlu memperbarui PATH secara langsung.

Menutup ini karena masalah judul asli tidak akan diselesaikan. Saya tidak mencegah komentar sekalipun.

@ChrisKader Anda hanya harus mempublikasikan skrip Anda sebagai alat terpisah.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

AllainPL picture AllainPL  ·  7Komentar

hsali picture hsali  ·  4Komentar

David263 picture David263  ·  3Komentar

martijnsenden picture martijnsenden  ·  3Komentar

tomByrer picture tomByrer  ·  4Komentar