Вчера я установил 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 с помощью какого-либо флага, чтобы люди, устанавливающие разные пути, могли работать без прав администратора.
Возможно, ваша среда предоставляет соответствующие права, но по умолчанию учетные записи пользователей должны быть частью группы Adminstrator, чтобы использовать mklink
. См. Https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links.
Есть ли причина использовать mklink вместо переменных среды локальной учетной записи? Если mklink не работает, файлы можно было просто скопировать. Переключение, а каталог - это не ссылка, просящая скопировать изменения обратно.
Это не так просто, как просто скопировать 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.
Скрипт делает следующее:
Я был бы более чем счастлив помочь внести эти изменения в вашу версию nvm, если вам интересно.
@ h404bi @coreybutler Я не уверен, почему "символическая ссылка больше не требует прав администратора" повторяется. Это требует, чтобы вы были в «Режиме разработчика», для включения которого требуются права администратора.
Пользователям может быть предоставлен доступ для создания символических ссылок с разрешением, но он по-прежнему не позволяет создавать символические ссылки в ограниченных каталогах (например, в программных файлах) без доступа администратора.
@ h404bi @coreybutler Я не уверен, почему "символическая ссылка больше не требует прав администратора" повторяется. Это требует, чтобы вы были в «Режиме разработчика», для включения которого требуются права администратора.
Пользователям может быть предоставлен доступ для создания символических ссылок с разрешением, но он по-прежнему не позволяет создавать символические ссылки в ограниченных каталогах (например, в программных файлах) без доступа администратора.
Соединения NTFS НЕ требуют прав администратора / режима разработчика. Вы можете отказаться от использования соединения, обнаружив, что он не находится в режиме разработки в Windows 10.
Мне было известно о переходах NTFS, но я не видел, чтобы они упоминались или ссылались на них в этой теме. Хотя бегло просмотрел. Это интересная концепция, но эксперименты привели к тому, что NTFS Junctions не была кроссплатформенной и плохо работала с общими сетевыми ресурсами. Оба из которых требовали использования в моей среде.
Основная причина, по которой я предпочитаю добавлять% PNMNJS% к пути пользователя и обновлять этот env var, заключается в том, что его ДЕЙСТВИТЕЛЬНО легко реализовать (и учесть) в разных средах (мой сценарий поддерживает OSX и Linux через PowerShell Core) и поскольку переменные среды могут быть вложены в другие, мне никогда не нужно напрямую обновлять PATH.
Закрытие, поскольку проблема с исходным названием не будет решена. Однако я не запрещаю комментарии.
@ChrisKader Вы должны просто опубликовать свой скрипт как отдельный инструмент.
Самый полезный комментарий
@ChrisKader Вы должны просто опубликовать свой скрипт как отдельный инструмент.