Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Перетаскивание файлов на форму, где уровень целостности - HIGH

20.09.2015, 14:10. Показов 2006. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!

Подскажите, пожалуйста, как грамотно спроектировать приложение.
Оно запускается с повышенными привилегиями (манифест), уровень целостности - Высокий. Такие права нужны его функционалу.
Но перетаскивание файлов на форму не работает, т.к. у Explorer-а IL - Medium.

Я предположил, что можно сделать такую схему:
запустить 2 процесса (основной с IL High, который запустит второй с IL - Medium, а 1-й скроет свою форму)
и они между собой будут общаться... только с помощью чего? SendMessage ведь тоже не будет работать... через канал сделать?

P.S. Вместо нового процесса не предлагать поток. (так уж вышло по религиозным причинам, здесь мне нужно обойтись без него, но с академическим интересом буду рад услышать любые предложения).
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.09.2015, 14:10
Ответы с готовыми решениями:

Перетаскивание файлов на форму
Всем привет! Появился вопрос, как перетащить несколько файлов на форму, чтобы пути к этим файлам добавились в comboBox, например? Заранее...

Перетаскивание на форму несколько файлов и работа через ListBox1
здравствуйте, у меня на форме есть компонент ListBox1 я дропаю один файл и работаю с ним. возникла новая задача!! нужно дропнуть пару...

Проверка целостности файлов (хэш)
Код написан не мной. Нужно просмотреть папку и подпаки, а также файлы, лежащие в них, сохранить информацию в файл, а затем проверить,...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.09.2015, 17:40
См. функции ChangeWindowMessageFilterEx (Win7+) и ChangeWindowMessageFilter (Vista+):

ChangeWindowMessageFilterEx function
https://msdn.microsoft.com/en-... s.85).aspx

ChangeWindowMessageFilter function
https://msdn.microsoft.com/en-... s.85).aspx

Они позволяют явно разрешить прием оконных сообщений от процессов, которые запущены
на более низком Integrity Level. Разумеется, тут нужно действовать очень продуманно, чтобы
не создать дыру в безопасности, через которую low-процесс станет high (shatter attack).
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.09.2015, 17:54  [ТС]
Спасибо. Просто отлично!
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.01.2016, 03:38  [ТС]
Для механизма Drag & Drop, созданного на базе COM-интерфейса, ChangeWindowMessageFilter функции бесполезны.
Как прокомментировали на stackoverflow:

Цитата Сообщение от Hans Passant
Yes, you're battling UIPI, an aspect of UAC that prevents unelevated programs from hijacking the resources of an elevated one. And yes, ChangeWindowMessageFilter() allows you to bypass this restriction for Windows messages.

However, OLE drag and drop doesn't use Windows messages. It uses callbacks, review the docs for RegisterDragDrop() for details. This microsoftie blog post tells you that you're screwed although it opens the door for CWMF. How to get a WM_DROPFILES message is however completely unclear to me. Using DragAcceptFiles() in a sample Windows Forms app had no discernible effect.
А по скольку у меня как раз OLE-based, следующий сценарий не дает позитивного эффекта:

C++
1
2
3
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
Одним из вариантов является подписание программы легитимным сертификатом с указанием в манифесте в секции trustInfo параметра UIaccess = true.

Добавлено через 3 минуты
Вообщем, придется отказываться от встроенного в моих формах COM и ловить WM_DROPFILES.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.11.2016, 15:49  [ТС]
Здравствуйте!

Кто-нибудь пробовал в деле Drag & Drop на окно с более высоким IL, используя uiAccess=true в манифесте?

Пусть для теста возьмём этот проект: https://code.msdn.microsoft.co... C-f3008aad

1) Подключаю следующий манифест:
Кликните здесь для просмотра всего текста

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="Alex.Dragokas"
        type="win32">
    </assemblyIdentity>
 
    <description>Alex Dragokas</description>
 
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="X86"
                publicKeyToken="6595b64144ccf1df"
                language="*"
             />
        </dependentAssembly>
    </dependency>
 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel
                    level="highestAvailable"
                    uiAccess="true">
                </requestedExecutionLevel>
            </requestedPrivileges>
        </security>
    </trustInfo>
 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
        <application>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows 10 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
        </application>
    </compatibility>
 
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
        </windowsSettings>
    </application>
 
</assembly>


2) Подписываю EXE с помощью самовыданного сертификата.
3) Добавляю сертификат в корневое хранилище.
4) Компилирую EXE и копирую его в одно из доверенных расположений (как описано в MSDN):
…\Program Files, including subfolders
…\Windows\system32
…\Program Files (x86), including subfolders for 64-bit versions of Windows
Запускаю, предупреждений от UAC не получаю.

Смотрю через Process Monitor вкладку Security.
В ней: Integrity = S-1-16-8202 (вместо Medium или High). Судя по этой статье, этот SID как раз и означает, что мы получили нужный IL.

Однако:
1) окно запрещает перетаскивание файлов из-под процесса с Medium IL, например рабочего стола.
2) не добились исходной цели, а именно: наш процесс должен был оказаться запущенным с полным токеном, а он у нас restricted.

Это я проверял на Win10.0.14393 x64
А на win7x64 поведение немного другое, отличается вот чем:

1) если запустить из-под Program Files программу с level="highestAvailable" и uiAccess="true", то система запросит привилегии через окно UAC (в win10 - не запрашивала).
2) а если программу с level="asInvoker", то Process Monitor покажет, что у процесса IL = High, а не S-1-16-8202 (как у Win10), хотя токен все равно restricted.

Как объяснить всё это и как добиться желаемого поведения от uiAccess для поддержки перетаскивания на окно процесса, имеющего полный токен?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.11.2016, 17:02
Насколько я знаю, - могу ошибаться!, - uiaccess=true предназначен для того,
чтобы иметь возможность управлять вводом процессов, запущенных на более высоком IL.
Например, процесс А, запущенный на medium IL, не может слать некоторые сообщения
процесс Б, у которого IL=high. Но если А запустить с uiaccess=true, это препятствие
будет преодолено.

А у тебя, судя по всему, ситуация обратная: Б запускается с uiaccess=true, а затем
процесс А пытается слать в Б сообщения. Но они не проходят, т.к. IL у Б уже
как бы повышен с medium до high.

наш процесс должен был оказаться запущенным с полным токеном, а он у нас restricted.
Поправка. Restricted token - это немного другое. А здесь, видимо, подразумевалось
'limited token'.

А на win7x64 поведение немного другое
Возможно, отличаются настройки UAC. Или политики безопасности.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.11.2016, 18:19  [ТС]
Возможно-возможно.

Вообщем, поменял я их местами, но это не сработало.

Создал стандартный проект MFC. Так же само подписал. В итоге в Process Explorer IL = S-1-16-8202. В MFC нажал Файл, открыть. Из этого диалогового окна пробовал перетащить файлы на окно процесса, запущенного с повышенными привилегиями, но оно не смогло принять сообщения.

Ладно, это был больше академический вопрос. Так что не суть важно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2016, 18:19
Помогаю со студенческими работами здесь

Проверка целостности системных файлов
Добрый день! Запустил sfc /scannow. Получил &quot;Программа защиты ресурсов Windows обнаружила повреждённые файлы, но не может восстановить...

Нарушение целостности системный файлов windows
Всем привет.Сегодня решил выполнить(профилактика) sfc\verifyonlyПосле выполнения команды windows обнаружила проблемы целостности файлов.Не...

Перетаскивание из Columns Editor на форму
Доброго времени суток! Примерно год назад мне показывали фишку с перетаскиванием полей из Columns Editor на форму. В итоге получался набор...

Перетаскивание данных на форму (Ярлык)
Здраствуйте! Подскажите пожалуйста как получить данные от перетащенного ярлыка на мою форму! Думаю больше тут добавить нечего и так все...

Windows XP BSOD и неполадки с проверкой целостности файлов
Windows XP.Захожу в командную строку под своим ником(я являюсь администратором) выполняю команду sfc /scannow, а мне пишет &quot;Чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru