Как программно изменить ассоциацию файлов без необходимости повышения прав - PullRequest
4 голосов
/ 03 января 2011

Как программно изменить сопоставление файлов, когда пользователь не не имеет прав администратора / повышенных прав (Win XP, Vista, 7)?Любые идеи о том, как обойти это?По сути, я хотел бы, чтобы мое приложение было таким же легким, как сейчас (оно не требует повышенных прав для установки и запуска).На данный момент я предлагаю графический интерфейс, где пользователь может изменить сопоставление файлов, но если у пользователя ограниченные права, все, что он делает, это показывает сообщение, что он не может этого сделать, и объясняет, как активировать «Запустить эту программукак администратор ", затем перезапустите программу.Если у пользователя есть права, я просто изменяю ассоциацию.

Есть лучший способ сделать это и остаться «легким»?

Ответы [ 4 ]

10 голосов
/ 03 января 2011

В Windows (начиная с Windows 2000) вам разрешено иметь общесистемную ассоциацию файлов, для которой необходимо установить повышенные привилегии, и для ассоциаций файлов пользователя.

Если вы хотите остаться lite , создайте сопоставление файлов per_user и все.

Взгляните на эту статью: Изменения в типах файлов и функциях сопоставления файлов в Windows 2000 и Windows Server 2003 .

2 голосов
/ 03 января 2011

Вы можете использовать ShellExecute для запуска вашей внешней утилиты. Обязательно включите значок «Щит» в действие, чтобы указать, что для него потребуются повышенные разрешения. Затем пользователю будет предложено сообщить, что ему требуются специальные разрешения.

Одна вещь, которую вы можете сделать, это добавить флаги в ваше собственное приложение, которые указывают, что оно будет изменять разрешения. А затем снова запустите ваше приложение со специальными флагами.

Например, если ваша заявка

MyApplication.exe

Вы можете породить

MyApplication.exe / setfiles

, который только устанавливает ассоциации файлов и затем завершается. Таким образом, вам нужно будет отправить только один исполняемый файл.

function RunAsAdmin(hWnd: HWND; filename: string; Parameters: string): Boolean;
var
    sei: TShellExecuteInfo;
begin
    ZeroMemory(@sei, SizeOf(sei));
    sei.cbSize := SizeOf(TShellExecuteInfo);
    sei.Wnd := hwnd;
    sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
    sei.lpVerb := PChar('runas');
    sei.lpFile := PChar(Filename); // PAnsiChar;
    if parameters <> '' then
        sei.lpParameters := PChar(parameters); // PAnsiChar;
    sei.nShow := SW_SHOWNORMAL; //Integer;
    Result := ShellExecuteEx(@sei);
end;
1 голос
/ 03 января 2011

Мое решение (в ожидании лучших альтернатив):

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

0 голосов
/ 03 января 2011

Вы можете найти решение в этом месте, используя реестр (операционная система - Windows XP), поэтому оно может быть неприменимо к вашему запросу: http://volvox.wordpress.com/2006/06/02/extensions-101/ - Извините, но по-французски ... Полное описание) и исполняемый файл для загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...