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

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

Я правильно понимаю, что из маркета могут быть установлены только Modern-приложения? И что в установщик Desktop-приложения нельзя запихать установку Modern-приложения в обход маркета? Т.е. фактически невозможно гарантировать наличие обоих компонентов на компьютере, о чем и говорит разработчик MS на StackOverflow: “Metro apps can't count on desktop apps or services being installed on the machine. And desktop apps can't count on Metro apps running since they can be suspended any time”
Десктопное приложение и Modern-приложение не могут установить друг-друга, но десктопное приложение после установки может отправить пользователя на страницу приложения в маркете, откуда он установит (ну или не установит) Modern-часть. Так же как Modern-приложение может маякнуть пользователю о необходимости установить десктоп-часть. В конце-концов, никто же не удивляется когда страничка в интернете просит обновить флеш или десктопное приложение требует более новый .NET.
Modern-приложению доступны стронние COM-компоненты, которые были установлены на Desktop?
Modern-приложению доступен канал доступа к своему десктоп-приложению — статья только об этом. А уж из десктоп-приложения вызывайте что хотите и отдавайте результат в Modern-приложение.
Насколько я понял из статьи, там доступен канал не только к своему десктоп-приложению, но и всем другим десктоп-приложениям, которые этого пожелали.

Спасибо за статью :-)
Если "Десктопное приложение и Modern-приложение не могут установить друг-друга, но десктопное приложение после установки может отправить пользователя на страницу приложения в маркете, откуда он установит (ну или не установит) Modern-часть.", то каким образом тогда работает «Relaunch Chrome in Windows 8 mode» и обратно? В маркет меня никто не направлял и я ничего не качал.
Честно — без понятия. Самому интересно.
Браузеры — это вообще отдельная категория приложений. Там один бинарь, который может работать и в десктопном режиме, и в полноэкранном (система ему говорит, в каком режиме запускаться), и даже в последнем у него больше привилегий, чем у обычного приложения — что, в частности, позволяет иметь общие с десктопом закладки, историю etc, а также делать вещи, недоступные обычным Store-приложениям, такие, как JIT-компиляция JS. Вот здесь (.docx) есть детальный разбор этой модели.

Из Store при этом такому браузеру ставиться нельзя.
НЛО прилетело и опубликовало эту надпись здесь
Кстати, я сначала прочитал как
дефолтное поведение можно изменить и из приложения в AppContainer, мы можем общаться…

НЛО прилетело и опубликовало эту надпись здесь
Не чушь. Сам по себе Protected Mode в IE < 11 ни от чего не защищал. Даже если его включить — процесс имел доступ к определенным папкам на диске, мог взаимодействовать с другими Low Integrity и Untrusted-процессами, в него можно было инжектить код, подгружать внешние библиотеки — т.е. по сути делать всё, что угодно. Только Enhanced Protected Mode реализовал полноценную песочницу на базе AppContainer, а Enhanced Protected Mode включен по-умолчанию только в Win8.1 + IE 11
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Неа, зона «Low Integrity» шире зоны «Low Integrity + AppContainer». В Low Integrity есть доступные на запись и чтение для всех Low Integrity — процессов папки и ветки реестра. Для AppContainer этого нет. Low Integrity процессы видят друг друга, AppContainer — нет. Low Integrity процессы видят глобальные именованные объекты, AppContainer видит лишь объекты в своём неймспейсе.

В общем, с чего бы это Microsoft вбухивал силы в Enhanced Protected Mode, если и прошлой технологии хватало?
НЛО прилетело и опубликовало эту надпись здесь
Вообще нормально песочница сделана только в Хроме, где прав нету просто никаких. Вот это действительно безопасно. А когда я вижу, что, ну процессу всё-таки можно кое-куда кое-что сохранить, что-то там открыть и т.д. — это сразу минус 100 очков к доверию. Как минимум возможна социальная инженерия вида «сохранить вирус в темп и объяснить пользователю на страничке в браузере, почему ему надо на этом файлике кликнуть „Run as administrator“.
НЛО прилетело и опубликовало эту надпись здесь
С технической точки зрения можно много чего. Например, можно дать Store-приложению полный доступ к какой-либо части файловой системы, открыв таковой доступ роли «ALL APPLICATION PACKAGES». А те же пайпы используются VS для работы дизайнера XAML.

Проблема в том, что кроме чисто технических ограничений есть и ограничения Store. В которых четко прописано, что Store-приложение не может каким-либо образом завязываться на другое приложение, в т.ч. и на десктопное. Т.е. если вы честно опишете, как работает ваша система, то вы просто не пройдете сертификацию. А если умолчите и пройдете, то это рано или поздно вскроется потом…

Кстати, абсолютно такая же ситуация с большим количеством Win32 API вызовов, которые, если верить MSDN, «are not available in Windows Store apps» — вы зачастую можете их позвать, и они даже будут работать, но WACK будет на них ругаться.
При этом зачем-то открыт доступ к локальной машине по сети через сокеты. Для этого даже специальное разрешением есть отдельное. Если я не могу завязываться на другое приложение — зачем такое разрешение?

Кроме того, можно предоставлять какую-нибудь функциональность просто так, даже без этого канала связи — такое приложение пройдёт проверку и будет работать. А для тех, кто поставит ещё и десктопную версию — будут дополнительные плюшки. Причём их в модерн-приложение может даже инжектить код десктопного, чтобы не палиться на проверках магазина.
Внезапно, серверные сокеты там для того, чтобы писать серверы :)

Ну и вы же понимаете, что проверки — проверками, а правила — правилами. О нарушении последних может написать и ваш конкурент, например. И будет очень грустно раскрутить приложение до популярности, а потом внезапно быть вынужденным его убрать, потому что вся его соль может быть реализована только с нарушением правил сертификации.
Попробовал использовать этот код для организации пайпа между обычным приложением и IE под EPM. Оказалось, что он прописывает не все необходимые права. После поисков по инету и экспериментов нашел такое решение:

function CreateAppContainerSecurityDescriptor(var SD: PSECURITY_DESCRIPTOR): boolean;
const
  SDDL_REVISION_1 = 1;
var
  pSD: PSECURITY_DESCRIPTOR;
begin
  result := false;
  if ConvertStringSecurityDescriptorToSecurityDescriptor('S:(ML;;NW;;;LW)D:(A;;0x120083;;;WD)(A;;0x120083;;;AC)',
    SDDL_REVISION_1, pSD, nil) then begin
    SD := pSD;
    result := true;
  end;
end;

function Start: boolean;
var
  SD: PSECURITY_DESCRIPTOR;
  SecurityAttributes: SECURITY_ATTRIBUTES;
begin
  result := false;
  if Win32MajorVersion >= 6 then begin
    if CreateAppContainerSecurityDescriptor(SD) then begin
      SecurityAttributes.nLength := sizeof(SECURITY_ATTRIBUTES);
      SecurityAttributes.bInheritHandle := true;
      SecurityAttributes.lpSecurityDescriptor := SD;

      PipeHandle := CreateNamedPipe('\\.\pipe\pipe1', PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_BYTE or PIPE_READMODE_BYTE, 1, 0, 0, 1000, @SecurityAttributes);
      result := PipeHandle <> INVALID_HANDLE_VALUE;
    end;
  end;
end;


Здесь три правила.
1) S:(ML;;NW;;;LW) — доступ к объекту из low integrity
2) D:(A;;0x120083;;;WD) — разрешение всем читать\писать в пайп
3) (A;;0x120083;;;AC) — разрешение всем AppContainer читать\писать в пайп
Встала задача вызова RPC сервера по lcalpc из Enhanced Protected Mode IE 11 Windows 8.1 — за сутки разобрался. Задача разрешима, но решение получилось не очень элегантное и не в две строчки — если кому интересно — прошу в ПМ.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий