Создание ярлыка на рабочем столе через API

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Создание ярлыка на рабочем столе через API

Сообщение aleksmir » 06.07.2013 (Сб) 20:53

Здравствуйте!
Подскажите, если кто сталкивался... как программно на рабочем столе создать ярлык, у которого будет сразу включено свойство "Запускать от имени администратора"?
Создавать ярлык с помощью библиотеки ShellLnk.tlb, я умею. Там используется интерфейс ShellLinkA. Но он не позволяется ярлыку присваивать данное свойство. Я слышал что для Windows NT/XP/2000 и т.д. разработан более продвинутый интерфейс ShellLinkW... но нигде нет примеров(

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Создание ярлыка на рабочем столе через API

Сообщение Vova_2581 » 09.07.2013 (Вт) 20:32

Можно использовать команду винды runas
runas /user:username "C:\path\program.exe" /savecred
Она сохранит пароль уже в самом ярлыке. Достаточно только однократно авторизоваться...
Ну если нужно каждый раз вводить пароль, то параметр /savecred нужно убрать.

Или при создании ярлыка прописать строку... которая должна быть в поле "Объект" в свойствах ярлыка.
C:\WINDOWS\system32\runas.exe /user:username /savecred "C:\path\program.exe"
username - соответственно логин администратора!

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re: Создание ярлыка на рабочем столе через API

Сообщение aleksmir » 12.07.2013 (Пт) 16:19

Vova_2581 писал(а):Можно использовать команду винды runas
runas /user:username "C:\path\program.exe" /savecred


Спасибо за предложенный вариант. Здесь минус в том, что пользователь должен
вводить имя администратора. А он его может не знать. И как определить имя пользователя-администратора программно я тоже не знаю. Догадками.. перебрать всех пользователей системы... типа если его зовут "Администратор" или "Administrator", тогда это он. А если ему другое имя дали при установке?

Такая проблема появилась в Windows 8 из-за того, что моя программа при запуске вначале запускает файл update.exe (чтобы проверить наличие обновлений), а Windows 8 такой запуск блокирует. Помогают одна из 2-х вещей, которые пользователь должен сделать вручную сразу после установки программы:
1) в свойствах ярлыка на вкладке "Дополнительно" поставить флажок "Запустить от имени администратора";
2) или поставить флажок "Запускать в режиме совместимости с Windows XP SP3".
Вот как это с ярлыком проделать программно, а не вручную?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.07.2013 (Пт) 16:26

Ярлык к твоей программе? Почему бы ей в манифест не написать требования на админские права, раз они нужны?

aleksmir писал(а):Здесь минус в том, что пользователь долженвводить имя администратора. А он его может не знать. И как определить имя пользователя-администратора программно я тоже не знаю.

Что-то тут не так... Он же сам админ, не? Иначе с чего бы твоему методу с флажком работать?

aleksmir
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 10.08.2009 (Пн) 13:17

Re:

Сообщение aleksmir » 12.07.2013 (Пт) 17:50

Qwertiy писал(а):Ярлык к твоей программе? Почему бы ей в манифест не написать требования на админские права, раз они нужны?

aleksmir писал(а):Здесь минус в том, что пользователь долженвводить имя администратора. А он его может не знать. И как определить имя пользователя-администратора программно я тоже не знаю.

Что-то тут не так... Он же сам админ, не? Иначе с чего бы твоему методу с флажком работать?


А как написать манифест?
Да у пользователя права админа (

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.07.2013 (Пт) 18:44

aleksmir писал(а):А как написать манифест?

Упс.. Я ни разу на VB6 его не добавлял...
Но говорят, имеется куча информации на эту тему :)
Если не ошибаюсь, можно просто файл манифеста рядом с exe'шником положить.

aleksmir писал(а):Да у пользователя права админа (

Тогда весело, что он собственные логин с паролем не знает ;)
Кстати, насчёт решения с runas - вероятно оно не будет работать, если у пользователя пароля нет.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Создание ярлыка на рабочем столе через API

Сообщение ger_kar » 12.07.2013 (Пт) 19:27

Qwertiy писал(а):Упс.. Я ни разу на VB6 его не добавлял...
Ну вообще основной вопрос (у меня по крайней мере) не в том, как присовокупить манифест к приложению, а содержание оного. Чего туда нужно добавить, чтобы реализовать искомое?
Qwertiy писал(а):Но говорят, имеется куча информации на эту тему
Есть конечно, например в MSDN, но несмотря даже на русский язык написанного, написано достаточно мутно и не очень понятно.
Qwertiy писал(а):Если не ошибаюсь, можно просто файл манифеста рядом с exe'шником положить.
Вообще из информации по ссылке, которую я привел выше, я так и не понял, нужно ли в манифесте указывать учетные данные администратора. Если таковые в манифесте нужно все таки прописать, то возложение манифеста рядом с экзешником будет тогда единственным способом. А если данные указывать не надо, тогда можно и в экзешник внедрить. Я например все системы после Windows XP просто органически не перевариваю в том числе и из-за жуткого геммора с этим UAC. Как говориться чем дальше в лес, тем больше геммороя.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.07.2013 (Пт) 23:58

ger_kar писал(а):Ну вообще основной вопрос (у меня по крайней мере) не в том, как присовокупить манифест к приложению, а содержание оного. Чего туда нужно добавить, чтобы реализовать искомое?
Есть конечно, например в MSDN, но несмотря даже на русский язык написанного, написано достаточно мутно и не очень понятно.

Что-то ты не то нагуглил... Где-то было нормальное описание с примером. Но в любом случае, оно мне уже не нужно, т. к. новые VS генерируют манифест с комментариями о том, что в нём надо изменить, чтобы получить желаемый результат. Изучай:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- Параметры манифеста UAC
          При необходимости изменить уровень управления учетными записями Windows замените
          узел requestedExecutionLevel одним из следующих значений.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            При указании узла requestedExecutionLevel виртуализация файлов и реестра будет отключена.
            Если вы хотите использовать виртуализацию файлов и реестра для обратной
            совместимости, удалите узел requestedExecutionLevel.
        -->
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Список версий Windows, для работы с которыми предназначено данное приложение.
      Windows автоматически выберет наиболее совместимую среду.-->

      <!-- Если приложение предназначено для работы с Windows Vista, снимите комментарий со следующего узла supportedOS-->
      <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>-->

      <!-- Если ваше приложение предназначено для работы с Windows 7, раскомментируйте следующий узел supportedOS-->
      <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->

      <!-- Если приложение предназначено для работы с Windows 8, снимите комментарий со следующего узла supportedOS-->
      <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>-->

    </application>
  </compatibility>

  <!-- Включите темы для наиболее общих элементов управления и диалоговых окон Windows (Windows XP и последующие версии) -->
  <!-- <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="*"
          publicKeyToken="6595b64144ccf1df"
          language="*"
        />
    </dependentAssembly>
  </dependency>-->

</asmv1:assembly>
  • asInvoker - запускать как есть
  • requireAdministrator - требовать права администратора даже если текущий пользователь ими не обладает (в последнем случае запрос на ввод админского логина с паролем)
  • highestAvailable - требовать права администратора, если текущий пользователь ими обладает, иначе запускать как есть

ger_kar писал(а):нужно ли в манифесте указывать учетные данные администратора

Конечно нет.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.07.2013 (Сб) 22:12

Ну что, кто-нибудь поэксперементировал с манифестом?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Создание ярлыка на рабочем столе через API

Сообщение ger_kar » 13.07.2013 (Сб) 22:19

Qwertiy писал(а):Ну что, кто-нибудь поэксперементировал с манифестом?
Мне для того чтобы ставить эксперименты нужно Windows 7 сначала поставить, а мне его что-то не очень охота устанавливать.
Бороться и искать, найти и перепрятать

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Создание ярлыка на рабочем столе через API

Сообщение Vova_2581 » 14.07.2013 (Вс) 12:30

ger_kar
Можно сделать виртуальную машину VMware Workstation и ставить эксперименты в ней. К тому же 7 устанавливается очень быстро.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.07.2013 (Пн) 1:53

Vova_2581 писал(а):VMware Workstation

Я за Virtual Box :)

PS: aleksmir куда-то пропал :(


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Bing-бот, Google-бот, Yandex-бот и гости: 38

    TopList