Как стать автором
Обновить

Комментарии 78

Мне кажется, или оно параметры передает без кавычек? То бишь попытка исполнения cmd.exe -c «C:\Program Files\tram-pam-pam.exe» вызовет ошибку?
В общем-то вы правы, но я не знаю однозначного способа экранировать пробелы для любого приложения (иначе как получив полный command line, приложения что в рамках PowerShell несколько затруднительно), т.к. у каждого приложения могут быть свои заморочки. Да взять тот же PowerShell – одит тип кавычек, другой, третий, и причем они не взаимозаменяемые!..

Сам я решаю эту проблему, задавая экранирующие символы при запуске скрипта:

powershell -File runas.ps1 cmd.exe /K echo \«quote test\»
cmd.exe -c C:\Progra~1\tram-pam-pam.exe
?
Товарищ предлагает использовать legacy-имена 8.3, чтобы избежать пробела.
В которых (legacy именах) все названия файлов/папок где больше 8 символов сокращались до шести и приписывалось ~1, либо ~2 и так далее по числу файлов с совпадающими первыми 6 знаками.
Плюс они могут быть отключены, начиная с windows xp
Я, кстати, написал, что runas требует ввода пароля или saved credentials, что в данном случае было неприемлемо. Как неприемлем и обход UAC с помощью scheduler.
Я это прочел, именно про это слова про усложнение. Просто на мой взгляд, если ты работаешь в консоли, то при запросе уход в другое окно (в данном случае UAC) — не правильно в корне. Либо консоль, либо GUI. Возможно во мне говорит линуксойд, но ИМХО — это правильно.
Ok, видимо требуется дать дополнительные пояснения.

Скрипт, который мне нужно было запустить, находится в архиве, который выходит с build server, он предназначен для настройки тестового окружения на ОДНОЙ машине под Windows 7, которая может быть виртуальной, не в домене и т.д. и т.п. Т.е. тестер берет архив, запускает скрипт, и получает готовое к работе тестовое окружение.

При этом ставится задача минимизировать совершаемые телодвижения. В данном случае один запрос UAC это IMHO приемлемо, а вот необходимость предварительно сохранять credentials – нет.
Это опять сторонняя утилита… И, если я правильно понял, работает она примерно так же.
А утилита psexec не рассматривалась? Она умеет и повышать права и принимает пароль.
Пытался я сделать полный аналог sudo с uac, но это невозможно из-за специальных ограничений архитекруты shellexecute, нельзя перенаправлять ввод/вывод, а без этого открывается новое окно — что ломает весь смысл.

Другое дело если кто-то найдёт как uac другим способом «зацепить», но это уже выше моего уровня =)
А как такой вариант? Sudo запускает Sudo Helper as administrator (может быть тот же самый EXE со спец. параметрами), устанавливает коммуникацию со своим родителем, и таким образом организует перенаправление ввода-вывода? :)
Ну примерно такой вариант мне тоже приходил в голову, но тогда UAC будет запрашивать разрешение на запуск самой «некой» sudo. (примерно так я и пытался сделать, но используя cmd.exe с перенаправлениями, fail в общем, как-то не догадался именно самого себя запускать)

В принципе я наверное так и сделаю в итоге, т.к. из других вариантов наверное только FindExecutable и AssocQueryString что очень громоздко конечно и имеет куда больше возможных точек сбоя.
Ну, меня запрос UAC никогда не пугал…
Если захочется от него избавится, я воспользуюсь runas ;-)
Спасибо!
Я два года плевался когда видел надпись «запрошенная команда требует повышения», а тут просто как гвозди оказывается.
Рад, что вам помог. =)
Извините, я просто не могу удержаться, я понимаю, что меня заминусуют, но я не могу об этом молчать!!!

sgzmd.i$ sudo commandname
я понимаю, что меня заминусуют

И правильно сделают. Вы видели в каком блоге, этот топик? Нафига холивары, если человеку нужно помочь решить проблему на Windows и об этом четко сказано в топике?
Видел. Но сделать все равно ничего не смог с собой :)
Чувак, ты на 100% прав.:) Сложно удержаться.:) 50% постов в разделе Windows про проблемы, которые линуксоидам кажутся смешными.
а вам не кажется что это разные архитектуры? у пользователей линукс есть такие проблемы, которые пользователям виндоус кажутся смешными. вы поймете о чем я или мне привести примеры?
от примеров я в любом случае не откажусь просто из интереса. если не хотите здесь холивор, то можно ЛС. как больше нравится.
самый яркий пример — драйвера на видеокарты ati.
другая сторона — отсутствие дров на некоторые железки. да, еще не все производители делают дрова под линукс, а те что делают либо делают их хорошо, либо до того хреново (для галочки), что ими пользоваться невозможно (камень в огород canon).
А, ты слово «архитектура» сказал, я думал, ты мне про архитектуру ОС будешь писать. «Архитектура ОС не позволяет сделать того или того...»

А с драйверами и прикладным ПО (фотошопы и автокады) известная проблема. А с Ati так даже не смешно.:( Только ведь это не проблема Linux'a как ОС. Linux перестали предустанавливать на Asus eee не потому, что он не работал, а потому что M$ давит на вендоров. Начни Adobe делать Photoshop для Linux, я посмотрю на их соглашение с Microsoft.

Есть же комплекты десктопного железа, которые сертифицируют с Linux.

А когда вижу посты на хабре про написание чего-нибудь на PowerShell, то волосы дыбом, потом что сразу знаешь, как-то это легко сделать на bash'e.
на счет дров и по — вот о том и говорю — у линуксоидов тоже свои болевые точки есть. И не надо тешить себя иллюзиями.

Да я и не спорю что на баше легко делается. я первое время без консоли скучал на венде, но ничего, притерся, привык.
Я если честно с большим интересом жду про проблемы архитектуры.
а что именно? вроде некоторые моменты осветили в этом треде
Ну трехгодичной давности проблемы с драйверами АТИ это не то чтобы пробдемы архитектуры. )
Не холивара ради, но дрова ати…
Три года назад — да были, наверное… Но три года назад я использовал дженту и видеокарту ati 9550(проблем не было — играл во все, что шло под вайном), сейчас использую убунту и встроенная в бук карточка ati hd3650, проблем нет — на прошлой неделе прошел half-life 2
Ипожалуйста, пользователи линукса, не надо минусовать за правду. Не стоит тешить себя иллюзиями что у вас всё хорошо. Я после 3 лет пользования линуксом и вендой имею представление о том, о чем говорю.
нет проблем, минусы не мои)
НЛО прилетело и опубликовало эту надпись здесь
Извините, но это всё равно что на вопрос «Как запустить IE9 в Wine» ответить «Купите Windows 7».
Бугогашечки. В windows есть команда runas. Интерфейс у неё, конечно, не такой удобный, но…

C:\WINDOWS\system32>type sudo.bat
runas /env /user:Administrator %1


Да, вот такой вот я извращенец.

PS: поищите по странице «runas» — поймёте, что автору эта команда (равно как и sudo под линуксом) не подходила.
можно просто cmd.exe стартовать с правами администратора.
Нажимаем Пуск, потом вводим в окошке ввода cmd, и жмем Ctrl-Shift-Enter

По идее и просто полный путь к своей программе указать — должно сработать
Запуститься с текущими привилегиями. Если это Win7 или другая ранняя версия Windows и пользователь не имеет административных полномочий — это не сработает.
Если бы мне нужно было запустить этот скрипт один раз или на одной машине я бы так и сделал :)
Сделал несколько криво: скопировал cmd.exe в sudocmd.exe, и прописал в его свойствах птицу «запускать от администратора».

После этого либо запускаем через sudocmd /c команда, либо заворачиваем в бантик для автоподстановки ключика /c.

Минусы — дополнительное консольное окошко.
IMHO основной минус вашего способа, как и многих других – необходимость предварительной подготовки.
Впрочем, должен заметить, что и установка PowerShell может считать дополнительное подготовкой…
Не в Win7/2008r2
Execution Policy все равно вручную задавать…
# Checking Execution Policy

$Policy = «Unrestricted»
If ((get-ExecutionPolicy) -ne $Policy)
{
Write-Host «Script Execution is disabled. Enabling it now»
Set-ExecutionPolicy $Policy -Force
Write-Host «Please Re-Run this script in a new powershell enviroment»
Exit
}
так он же встроен в W7.
Выполнить Set-ExecutionPolicy RemoteSigned все равно придется.
runas /user:%username% cmd
а если это была шутка, то не смешно.
В XP можно было использовать прекрасную утилиту CPAU, но она не умеет работать с UAC. Поэтому можно взглянуть на runasspc, но она платна для коммерческого использования…
Два вопроса:
1. Пароль вводить потребуется? Хотя бы один раз?
2. При использовании этой утилиты предупреждение UAC будет?
Последней указанной утилитой пользоваться не доводилось, но судя по описанию и то, что она является аналогом CPAU, то не надо. Программа вызывается с параметрами среди которых есть и пароль и вот отличии от CPAU его можно передавать не открытым текстом и шифрованным. За подробностями либо по ссылке либо в гугл.
Тогда это немного не то :)
Powershell tip of the day:

Running Commands Elevated

You can launch a separate PS environment and elevate it if you are running your script in a restricted environment and want to run a specific command with fully elevated privileges:

Start-Process powershell.exe -argumentlist '-command new-eventlog -logname application -source MyScripts' -verb runas
Добавь сюда ключик -Wait и наслаждайся.
Безумно раздражает, когда твой пост читают наискосок. Я, между прочим, подробно написал, почему Start-Process тут не прокатывает!
То, что вам не удается при помощи -wait из под непривилегированного пользователя приостановить процесс запущенный с повышенными привилегиями — на мой взгляд все правильно иначе можно было бы творить очень жесткие вещи с системой.

А вот задуматься, а для чего вы используете -Wait не пробовали? Зачем вам надо перехватывать заккрытие процесса, запущенного под админом? Чтобы ошибки показать пользователю в консоли? Может просто в лог писать будет быстрее и проще?

Часто решение проблемы лежит не в плоскости вызова глубоких кишок чтобы сделать то, что вы хотите, но в другом подходе к задаче.
Ключик -Wait не приостанавливает процесс, а указывает, что нужно дождаться его завершения.

Мне это нужно, чтобы после завершения настроек принудительно открыть readme-файл. Как ни крути, а запускать браузер от имени администратора – это IMHO не самое лучшее решение. А вот понизить ему привилегии при запуске, или дождаться завершения скрипта инсталляции – тут, по-моему, особой разницы нет.
А можно ли как-нибудь из программы запросить привелегии администратора во время выполнения в Win7 или Vista? Например, мне нужно записать в системную папку, как некоторые приложения запрашивыют права прямо на ходу?
Насколько я знаю, чаще всего они запрашивают сами себя с параметрами указывающими что делать и повышенными привелегиями.
msdn.microsoft.com/en-us/library/bb756973.aspx
НЛО прилетело и опубликовало эту надпись здесь
К нему должен прилагаться пароль :)
А почему скрипт? Напишите маленькую утилку в exe, которая себя элевейтнит и запустит нужное. Просто это самый простой вариант что пришёл мне в голову. Или есть ограничения в задаче почему так нельзя?
А потому что без разницы, а утилиту IMHO сложнее сопровождать.
А потому что без разницы, а утилиту IMHO сложнее сопровождать.
А я вот так сделал:
habrahabr.ru/qa/4329/#answer_18829

А я еще с висты прикопал у себя в %PATH% вот такой файлик sudo.vbs:
argc = WScript.Arguments.Count
set argv = WScript.Arguments
if argc < 1 then
WScript.Echo "Usage: sudo <arg1 arg2 .. argN>"
WScript.quit
end if
dim str
for i = 1 to argc-1
str = str + " " + argv(i)
next
set objShell = CreateObject("Shell.Application")
objShell.ShellExecute argv(0), str, "", "runas", 1


Забыл один нюанс — в ком. строке расширения исполняемых файлов отлично подставляются автоматом, а вот в диалоге по Win+R — нет, поэтому либо правим реестр, либо кладем рядом с sudo.vbs еще вот такой sudo.bat:
start "" /B %~dp0sudo.vbs %*

1. создать > ярлык > указать путь к программе
2. свойства > ярлык > дополнительно > запуск от имени администратора
3. в командной строке набрать <имя_ярлыка>.lnk
Какое ни какое решение автор для себя сделал, но предложу свой способ. Когда то давно делал для себя. Написал программку RunAs (скачать). Моя программка позволила писать логин и пароль в командной строке. То есть, если сделать в .bat файле и запустить её, то пароль писать вообще не придётся.
Программка написана на языке Delphi 7. Если нужны исходники — могу дать. Можно модифицировать под свои нужды.
Как запускать можно посмотреть через: RunAs.exe /?
вендам надо sudo!
start-process powershell -verb runAs
сделает тоже самое
start-process -FilePath C:\WINDOWS\system32\cmd.exe -verb runas
для cmd
Для тех кто ещё ищет решение этой проблемы, я, столкнувшись с этим сам, нашёл такое решение: jagaroth.livejournal.com/63875.html
Start-Process 'cmd.exe' -Verb RunAs -Wait
Работает на win10.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.