Nvm-windows: nvm должен работать без прав администратора

Созданный на 13 июн. 2019  ·  19Комментарии  ·  Источник: coreybutler/nvm-windows

Вчера я установил nvm на машину, на которой у меня нет прав администратора. Я решил использовать отдельные пути для nvm и npm, чем стандартные пути Windows, чтобы я мог преодолеть потребность в правах администратора.

nvm смог загрузить версии, но процесс символической ссылки не работал, хотя я мог вручную создать ссылку с помощью mklink без каких-либо проблем.

Я решил проверить код и изменил файл elevate.cmd на это:

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

Эта версия файла теперь работает без прав администратора и выполняет свою работу. Было бы здорово иметь возможность настроить это в settings.txt с помощью какого-либо флага, чтобы люди, устанавливающие разные пути, могли работать без прав администратора.

Самый полезный комментарий

@ChrisKader Вы должны просто опубликовать свой скрипт как отдельный инструмент.

Все 19 Комментарий

Возможно, ваша среда предоставляет соответствующие права, но по умолчанию учетные записи пользователей должны быть частью группы Adminstrator, чтобы использовать mklink . См. Https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links.

Есть ли причина использовать mklink вместо переменных среды локальной учетной записи? Если mklink не работает, файлы можно было просто скопировать. Переключение, а каталог - это не ссылка, просящая скопировать изменения обратно.

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

Это не так просто, как просто скопировать node.exe . Корень установки содержит (по умолчанию) глобальный каталог node_modules и ряд других сценариев. Итак, либо _все_ из этого необходимо скопировать / очистить, либо конфигурацию клиента npm необходимо обновить, чтобы определить местоположение глобального каталога node_modules .

Копирование занимает огромное количество времени и приводит к огромному оттоку файловой системы, когда у вас есть подключенные / сетевые диски или перемещаемые профили. Итог: нет никакой гарантии, что файлы действительно будут храниться на локальном жестком диске. Они могут быть на NAS / SAN и т. Д. Не говоря уже о том, что нередко можно увидеть модули узлов объемом в гигабайты в каждой установленной версии, поэтому даже копирование на локальный жесткий диск может занять довольно много времени.

Учитывая, сколько существует различных версий npm (не говоря уже о том, что это коммерческий инструмент), манипулирование средой npm, чтобы понять, где находится глобальный каталог node_modules выходит за рамки этого проекта. Кроме того, есть еще пряжа, которую следует учитывать.

Используются локальные переменные среды. PATH содержит путь символьной ссылки. Не рекомендуется изменять PATH больше, чем это необходимо (что по-прежнему требует прав администратора). Если во время процесса возникнет сбой или ошибка, весь PATH может быть уничтожен (я пробовал это в первые дни NVM4W). Тем не мение; можно изменить место назначения символической ссылки, что избавляет от необходимости изменять переменную среды PATH. Вот почему используется mklink.

Таким образом, сетевые диски не поддерживаются, а флеш-накопители Fat32 не поддерживаются (не поддерживает mklink). Запрос с вопросом, действительно ли вы хотите скопировать файлы, решит проблему «оттока файлов». Пользователь может войти в режим администратора. Или они могут выбрать отток файлов. Или отменить.

Если вы копируете файлы, путь не должен указывать этот путь более одного раза. И PowerShell может изменить путь к среде текущего пользователя (а не системы) без прав администратора. И, если этот путь будет атакован, системный путь все равно будет безопасным. Кажется, намного менее опасно.

Это потребует некоторых экспериментов. Я попробую на работе во время перерыва или обеда. Перешел на Linux дома.

Проведем еще одно исследование: «Любой пользователь Windows 10 с включенным режимом разработчика сможет создавать символические ссылки, используя либо mklink». Это тоже может быть возможным ответом. Убедите людей на работе, что я разработчик и мне нужен режим разработчика.

Вопрос в том, будет ли нужен режим администратора, если включен режим разработчика?

Я не могу авторитетно ответить, отменяет ли режим разработчика необходимость в правах администратора. Думаю, да. Тем не мение; любые операции, касающиеся C:\Program Files требуют прав администратора (если режим разработчика также не отменяет это ограничение).

Сетевые диски поддерживаются mklink при использовании в качестве соединения. О рентабельности инвестиций при использовании переходов было много споров, так что это никогда не было реализовано.

Помните, что доступность Powershell во всех средах не гарантируется.

Я не возражаю явно против подхода к копированию файлов, если он а) находится за подсказкой флага / интерфейса командной строки и б) не требует визуального интерфейса. Эта последняя часть важна, потому что существует ряд автономных служб CI, использующих ее.

Почему я обычно устанавливаю инструменты разработки c: \ programs \ (без прав администратора и без пробелов в пути). c: \ programs \ nvm и настройте узел для установки в c: \ programs \ nodejs.

powershell.exe -command '[Environment]::SetEnvironmentVariable("PATH",[Environment]::GetEnvironmentVariable("PATH","User")+"c:\programs\nvm","User")' || XSET PATH "%PATH%;c:\programs\nvm"
Кажется, работает нормально? xset, похоже, тоже работал (пришлось подождать несколько минут, прежде чем они появились с xset)? У меня отключен UAC на компьютере с Windows, который я использую сейчас. Завтра на работе проверю.

tl; dr https://github.com/PowerShell поддерживает Linux (не то, чтобы я когда-либо использовал его там). Поэтому я не могу придумать среду, которую Powershell не может поддерживать, которую также не может поддерживать nvm. node и powershell запускают сценарии. Для узла нет встроенных сертификатов с обязательной подписью для проверки подлинности сценария и отсутствия подделки. У Powershell это есть. npm audit является реактивным. imho, узел не готов к серверу, если вам нужна полная безопасность. Однако большинство людей этого не делает. Прокси достаточно хороши.

Возможно, ваша среда предоставляет соответствующие права, но по умолчанию учетные записи пользователей должны быть частью группы Adminstrator, чтобы использовать mklink . См. Https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links.

Создание символических ссылок больше не требует доступа администратора, начиная с Windows 10 Build 14972 , более того, вы можете использовать Junction вместо symlinks для ссылки, поэтому он может работать без прав администратора при создании символических ссылок. в пользовательском пространстве, например C:\Users\<user> . Прикосновение к C:\Program Files прежнему требует прав администратора.

Мой вопрос в том, почему по умолчанию не делать nvm-windows прав администратора, и если один пользователь пытается что-то сделать с C:\Program Files или другими путями, требующими прав администратора, тогда выполните повышение разрешений вместо запроса администратора права везде.

To @mschmiedel Если вы хотите использовать nvm-windows без прав администратора, у меня есть форк ( релиз ) для вас, но он не может работать с общесистемным Node.js (я не тестировал его, он может работать под повышенная подсказка).

связанные с # 79 # 383

@ h404bi, почему бы не сохранить уровень администратора (я не думаю, что elevate.vbs / .bat не следует пропускать). Но выполнять повышение прав администратора только при сбое соединения и повторной попытке? Единственная причина, по которой он должен выйти из строя, - это сбой разрешений. Например, узел или nvm устанавливаются в файлы c: \ program. В противном случае запрос на вытягивание выглядит многообещающим (просто глядя на разницу).

https://github.com/tamusjroyce/nvm-windows - моя попытка. Но я никогда не прикасался к голангу. Я почти уверен, что это рухнет и сгорит. bin / install.cmd (хотя я не понимаю, как он может распаковать архив, в котором находится?). Не уверен, почему мой git испортил двоичные файлы. Но честно предупреждение (лучше всего, если двоичные файлы отделены от системы управления версиями).

При установке рекурсивно вызовите сценарий установки с помощью elevate.cmd, если не удается разрешить запись в NVM_PATH.
echo "Проверить, требует ли путь nvm запись для создания файла администратором">% NVM_PATH% \ checkpermissions.txt || elevate.cmd install.cmd% NVM_PATH%

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

@ h404bi Единственное, что я

Тем не менее, все еще должен быть флаг для использования перекрестков. Это было в моем списке дел уже очень давно. Это должен быть вариант конфигурации ... который ведет к еще большей проблеме. Я очень хотел избавиться от файла settings.txt с самого первого выпуска. Я экспериментировал с подходом SQLite, который хорошо работает в других приложениях, которые я создавал, но еще не готов для NVM4W.

Я посмотрю на вилки, как только смогу. Я не уверен, когда у меня будет время. А пока лучший способ объединить что-то - убедиться, что оно работает, по крайней мере, через Win 8.1.

Есть несколько способов заставить mklink работать, не будучи администратором (вплоть до явного предоставления SeCreateSymbolicLinkPrivilege).
Почему бы просто не попробовать запустить его и только в случае неудачи повторить попытку с повышением уровня?

Так раздражает вводить учетные данные локального администратора дважды для каждого изменения узла ...

Единственное, что я сомневаюсь в том, чтобы отказаться от прав администратора по умолчанию, - это то, что количество пользователей, которые могут воспользоваться этим, пока все еще в меньшинстве.

Я устанавливаю nvm , используя совок менеджер пакетов. По умолчанию устанавливайте пакеты в ~/.scoop . В настоящее время установка nvm с использованием подсказок для прав администратора. Было бы неплохо исправить это.

@JoyceBabu, вы можете попробовать мою вилку: https://github.com/h404bi/dorado/blob/master/bucket/nvm-windows.json

В настоящее время у меня есть сценарий PowerShell (он сильно вырос), который я сделал для себя и других разработчиков на работе (около 200 человек). Я называю это «PNM: PowerShell NodeJS Manager». Это было создано в результате сдвига в отрасли, при котором среда разработчиков более защищена, и в результате разработчики не имеют доступа администратора (если они и имеют, то обычно это другая учетная запись). Я также твердо убежден, что программы не должны запускаться с повышенными привилегиями, если это не абсолютно необходимо (независимо от того, есть ли у пользователя права администратора или нет). Когда я заметил, что nvm не требует повышенных привилегий на других платформах (Linux, OS X и т. Д.), Я решил создать решение, которое будет работать так же в Windows.

Хотя это правда, что Windows 10 больше не требует прав администратора для создания / изменения символических ссылок, она ДЕЙСТВИТЕЛЬНО требует, чтобы система находилась в «режиме разработчика» (для включения которого требуются права администратора). Любая среда, в которой разработчик не имеет прав администратора, вероятно, не имеет своей рабочей станции в «режиме разработчика».

Таким образом, этот сценарий PowerShell использует пользовательские переменные env.

Скрипт делает следующее:

  • Перечислены не все переключатели и точные детали.

    • Этот сценарий PS с годами расширился, чтобы предоставить МНОГО вариантов настройки.

  • Выполнение «pnm ins v10.0.1 productZ [dft] [node-gyp, nextGlobalPackage, nextGlobalPackage2]» приведет к

    • Загрузите и извлеките nodeJS версии 10.0.1 и поместите его в отдельную папку с подкаталогом nodejs.

    • Назовите папку v10.0.1_productA и разрешите использовать имя экземпляра или версию узла



      • «Pnm use productZ»


      • «Pnm use v10.0.1»


      • Если существует более одного экземпляра 10.0.1, он будет использовать тот, который был помечен по умолчанию при его установке.


      • Если значение по умолчанию не было указано, пользователю будет предложено выбрать, какой экземпляр



    • Установите «node-gyp», «nextGlobalPackage» и «nextGlobalPackage2» в глобальную папку node_modules указанных экземпляров.

    • Обновите файл конфигурации, указав информацию об экземпляре и установленных модулях.

    • В случае конфликтов пользователь будет повышен до разрешения.

  • «Pnm sync [dry] productZ [> | =] productA»

    • сухой



      • Предоставляет список изменений на основе предоставленных параметров, но НЕ будет вносить изменения (неразрушающие)



    • >



      • При этом «npm» установит все глобальные модули, установленные в экземпляре «productZ», в экземпляр «productA».


      • НЕ удаляет модули из productA, которых нет в productZ



    • знак равно



      • Синхронизирует productA с модулями, установленными в productZ


      • УДАЛЯЕТ все модули из productA, которых нет в productZ



    • <=



      • Напротив вышеуказанного.



  • «Pnm rst [полные | моды] productZ»

    • Команда обновит файл конфигурации с последними обновлениями в папке node_modules перед выполнением ниже.

    • полный



      • удалит весь каталог и повторно загрузит (или использует кешированную версию) nodeJS и установит модули



    • моды



      • rmdir -rf папку node_modules и переустановите из списка в конфигурации



  • «Pnm ls rmt»

    • Список версий nodeJS (и npm), доступных для загрузки И установки



      • Будет проверять наличие обновлений и загружать или использовать файл в папке кеша.



  • «Pnm ls lcl»

    • Список версий nodeJS, доступных для установки (уже загруженных)

  • «Pnm cfg sys [mgt 'C: \'] [cln] [save]»

    • Требуются права администратора

    • Настраивает PNM для использования в системе env var

    • Удаляет переменные окружения PNM с уровня пользователя

    • Обновляет env vars PNM на системном уровне

    • Использование migrate и указание пути переместит папку .pnm на путь

    • Указание очистки создаст папку .pnm по пути, настроит структуру папок и скопирует файл config.json.

    • Затем он установит каждый экземпляр на основе файла config.json.

    • После завершения и проверки старая папка .pnm удаляется, если не указан флаг сохранения.

  • «Pnm cfg usr [имя пользователя]»

    • Требуется администратор

    • Отменяет изменения, внесенные в конфигурацию системного уровня, и применяет их к указанному имени пользователя или текущему пользователю, если он не указан.

  • «Pnm init [sys | usr] [имя пользователя]»

    • Флаг инициализации можно комбинировать с путем к существующему файлу config.json.

    • Будет настроен для указанного имени пользователя (если у пользователя есть доступ).

    • Затем установка PNM будет настроена, как описано в файле конфигурации.



      • Это включает настройку каждого экземпляра в файле (и установку всех глобальных модулей в папке экземпляров node_modules).



    • Создает папку с именем «.pnm» в% USERPROFILE%



      • config.json





        • Содержит настройки по умолчанию для всех триггеров (пример ниже)



        • арка: x86 или x64



        • chcDir



        • Может быть любой каталог, доступный для чтения и / или записи.



        • Позволяет создать общий сетевой ресурс, содержащий все установки nodeJS, для использования кем угодно, например



        • Если у пользователя нет доступа на запись, каталог будет использоваться для установки любой указанной версии.





      • alwsNew: правда или ложь





        • Всегда будет создавать новый экземпляр nodejs, если устанавливаемая версия уже существует



        • Если имя экземпляра не указано, оно просто увеличивается на 1.





      • instMap: истина или ложь





        • Управляет обновлением сопоставления экземпляров в файле конфигурации при установке или настройке экземпляров.



        • Это позволяет сохранять установку каждого экземпляра в файл конфигурации при документировании



        • версия nodeJS



        • версия npm



        • установленные модули



        • Он обновляется пользователем, запустившим «pnm updMap».



        • Это дает пользователю центральную точку, которая содержит все конфигурации их экземпляров, что позволяет легко выполнить резервное копирование и / или переустановить позже.



        • Работает аналогично package.json в проекте nodeJS



        • Пользователи могут создать второй узел с именем «userOverrides», который позволяет им заменять значения по умолчанию желаемыми значениями.





      • nodejs





        • Эта папка содержит каждый экземпляр nodejs



        • Структура именования: «v [версия nodeJS] _ [Имя экземпляра NodeJS]



        • Хотя PNM позволяет пользователям устанавливать несколько версий NodeJS, позволяет им также устанавливать несколько копий одних и тех же версий.



        • Это позволяет пользователям делать много творческих вещей, но также позволяет им использовать имена или версии при замене местами.



        • "Pnm use acmeInstance"



        • Переходит к экземпляру с именем «acmeInstance»



        • «Pnm use v10.0.1 acmeInstance»



        • Подключается к экземпляру с именем «achmeInstance» И nodeJS версии 10.0.1.





      • тайник





        • Эта папка содержит кешированную версию https://nodejs.org/download/release/index.json.



        • Когда выполняется «pnm list avl», PNM вставляет время создания файла index.json в заголовок «If-Modified-Since» веб-запроса.



        • Если nodejs.org отвечает 304, это означает, что файл не был обновлен, и PNM использует значения в сохраненном JSON.



        • Если он был обновлен, ответ будет содержать JSON.



        • Это значительно снижает использование полосы пропускания и делает работу пользователя более плавной.



        • Если это указано в файле config.json, он также будет содержать папку с каждым ZIP-файлом версии nodeJS, в который загружается.





      • pnm.ps1





        • Основной сценарий PowerShell






    • Создает пользовательскую переменную env с именами «PNM» и «PNMNJS».

    • PNM указывает на директора .pnm в папке профиля пользователя.

    • PNMNJS указывает на текущий выбранный экземпляр nodeJS.



      • Эта пользовательская переменная env обновляется до пути экземпляра, указанного при выполнении «pnm use».



    • Помещает новые переменные PNM и PNMNJS в начало пользовательской среды PATH.

    • Обновляет пользовательский профиль PowerShell, чтобы включить в него основной скрипт Powershell PNM.

Я был бы более чем счастлив помочь внести эти изменения в вашу версию nvm, если вам интересно.

@ h404bi @coreybutler Я не уверен, почему "символическая ссылка больше не требует прав администратора" повторяется. Это требует, чтобы вы были в «Режиме разработчика», для включения которого требуются права администратора.

Пользователям может быть предоставлен доступ для создания символических ссылок с разрешением, но он по-прежнему не позволяет создавать символические ссылки в ограниченных каталогах (например, в программных файлах) без доступа администратора.

@ h404bi @coreybutler Я не уверен, почему "символическая ссылка больше не требует прав администратора" повторяется. Это требует, чтобы вы были в «Режиме разработчика», для включения которого требуются права администратора.

Пользователям может быть предоставлен доступ для создания символических ссылок с разрешением, но он по-прежнему не позволяет создавать символические ссылки в ограниченных каталогах (например, в программных файлах) без доступа администратора.

Соединения NTFS НЕ требуют прав администратора / режима разработчика. Вы можете отказаться от использования соединения, обнаружив, что он не находится в режиме разработки в Windows 10.

Мне было известно о переходах NTFS, но я не видел, чтобы они упоминались или ссылались на них в этой теме. Хотя бегло просмотрел. Это интересная концепция, но эксперименты привели к тому, что NTFS Junctions не была кроссплатформенной и плохо работала с общими сетевыми ресурсами. Оба из которых требовали использования в моей среде.

Основная причина, по которой я предпочитаю добавлять% PNMNJS% к пути пользователя и обновлять этот env var, заключается в том, что его ДЕЙСТВИТЕЛЬНО легко реализовать (и учесть) в разных средах (мой сценарий поддерживает OSX и Linux через PowerShell Core) и поскольку переменные среды могут быть вложены в другие, мне никогда не нужно напрямую обновлять PATH.

Закрытие, поскольку проблема с исходным названием не будет решена. Однако я не запрещаю комментарии.

@ChrisKader Вы должны просто опубликовать свой скрипт как отдельный инструмент.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги