Обходной путь против ограничения манипулирования реестром в Windows 7? - PullRequest
0 голосов
/ 01 апреля 2011

Хорошо, так как в xp большинство людей регистрируются как администраторы - программисту легко заставить программу работать с реестром.Я пытаюсь сделать следующее:

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

Однако это не работает в XP, когда пользователь ограничен, и то же самое в Vista, 7,2008.

Какие обходные пути?Я думал, чтобы программа создала запланированное задание или была привязана к процессу с более высокими привилегиями?Любой рабочий способ?Я отмечаю это как .net, так как мое программное обеспечение связано с .net - фактически то же самое происходит и в c ++ - но я тайно надеюсь, что net предлагает более простые методы для его решения.10x заранее!

Ответы [ 3 ]

6 голосов
/ 01 апреля 2011

Хм, это не ограничение Windows 7;это на самом деле дизайн. Подробнее см. Мой ответ здесь .

То, что вам нужно, называется повышение прав процесса .Это стандартный способ решения этой проблемы, механизм, встроенный в UAC, который позволяет пользователям идентифицировать себя как администраторов и временно получить все привилегии и обязанности, связанные с этим названием.Сама Windows использует это повсеместно:

Example of elevation shield displayed in Windows UI

Здесь есть фантастическая статья с практическими рекомендациями: Иконки щита, UAC и процессповышение прав в .NET .
Но для краткости, если гнить ссылка, выполните следующие шаги:

  1. Определите, есть ли у пользователя соответствующие разрешения.Самый простой способ - вызвать функцию API IsUserAnAdmin.

  2. Уведомить пользователя о необходимости повышения с помощью значка «щит».В WinForms вам нужно установить для свойства FlatStyle кнопки значение «Система» и использовать P / Invoke для отображения экрана.Пример кода:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int Msg,
                                            IntPtr wParam, IntPtr lParam);
    
    public const int BCM_SETSHIELD = 0x0000160C;
    
    public static void SetButtonShield(Button btn, bool showShield)
    {
        // Verify that we're running on Vista or later
        if ((Environment.OSVersion.Platform == PlatformID.Win32NT) &&
            (Environment.OSVersion.Version.Major >= 6))
        {
            SendMessage(btn.Handle, BCM_SETSHIELD, IntPtr.Zero,
                        showShield ? new IntPtr(1) : IntPtr.Zero);
        }
    }
    
  3. Перезапустите процесс с правами администратора.Это включает показ диалогового окна возвышения, чтобы позволить пользователю поднять программу.Пример кода:

    ProcessStartInfo psi = new ProcessStartInfo
                               {
                                   Arguments = "-justelevated",
                                   ErrorDialog = true,
    
                                   // Handle is the handle for your form
                                   ErrorDialogParentHandle = Handle,
                                   FileName = Application.ExecutablePath,
                                   Verb = "runas"
                               };
    try
    {
        Process.Start(psi);
        Close();
    }
    catch (Exception ex)
    {
        // the process couldn't be started. This happens for 1 of 3 reasons:
    
        // 1. The user cancelled the UAC box
        // 2. The limited user tried to elevate to an Admin that has a blank password
        // 3. The limited user tries to elevate as a Guest account
        MessageBox.Show(ex.Message);
    }
    
  4. [Необязательно] Кодовый знак ваша заявка на замену враждебного желтого фасада UAC на более приятный серый или синий.

1 голос
/ 01 апреля 2011

Это должно быть для каждого пользователя, и тогда у вас не будет проблем с разрешениями. HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run

0 голосов
/ 01 апреля 2011

Цель ограниченных пользователей - предотвратить это.

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