Предотвращение всплывающего окна брандмауэра Windows

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

Это происходит с множеством других приложений (Spotify, чтобы привести один пример), но мы хотели бы предотвратить появление этих всплывающих окон, поскольку они могут быть немного проблематичными для наших пользователей. Некоторые приложения (MSN Messenger, GoogeTalk) работают, не заставляя брандмауэр предупреждать пользователя, и мы хотели бы сделать то же самое.

Мы успешно сделали это в Windows XP, когда наш установщик написал соответствующие ключи реестра по адресу:

HKLM \ SYSTEM \ ControlSet001 \ Services \ SharedAccess \ Parameters \ FirewallPolicy \ StandardProfile \ AuthorizedApplications \ List

Однако это не оказывает такого же эффекта на Windows 7 - всплывающие окна брандмауэра по-прежнему имеют место.

Есть идеи, как мы можем это сделать? (Наши установщики и программное обеспечение имеют цифровую подпись.)

Спасибо

HKLM \ SYSTEM \ ControlSet001 \ Services \ SharedAccess \ Parameters \ FirewallPolicy \ StandardProfile \ AuthorizedApplications \ List

Однако это не оказывает такого же эффекта в Windows 7 - всплывающие окна брандмауэра по-прежнему имеют место.

Есть идеи, как мы можем это сделать? (Наши установщики и программное обеспечение имеют цифровую подпись.)

Спасибо

HKLM \ SYSTEM \ ControlSet001 \ Services \ SharedAccess \ Parameters \ FirewallPolicy \ StandardProfile \ AuthorizedApplications \ List

Однако это не оказывает такого же эффекта в Windows 7 - всплывающие окна брандмауэра по-прежнему имеют место.

Есть идеи, как мы можем это сделать? (Наши установщики и программное обеспечение имеют цифровую подпись.)

Спасибо Есть ли способ динамического доступа к суперглобальным переменным, как я пытаюсь сделать во втором примере кода? Если нет, есть ли лучший / более эффективный способ выполнить то, что я делаю в третьем примере кода?


Мое решение: Благодаря ответу Тома Хейга , вот последний код, который я мы будем с:

function isset_and_is ($superglobal, $key, $value)
{
    $ref =& $GLOBALS['_' . strtoupper($superglobal)];

    return isset($ref[$key]) && $ref[$key] == $value;
}

7
задан Community 23 May 2017 в 11:55
поделиться

4 ответа

Вы можете сделать это так:

function test($var) {
    //this 
    var_dump( $GLOBALS[$var] );

    //or this
    global $$var; //this is needed even for superglobals
    var_dump($$var);
}

test('_GET');

, чтобы вы могли использовать что-то подобное в вашем случае

function isset_and_is ($superglobal, $key, $value) {
    $var = '_' . $superglobal;
    return isset($GLOBALS[$var]) && ($GLOBALS[$var][$key] == $value);
}

$is_login = isset_and_is('GET', 'action', 'login');

Или, альтернативно, вы можете взять переменную по ссылке и использовать isset () , например

function get_var(& $var) {
    if (isset($var)) {
        return $var;
    }
    return null;
}

//will not give you a notice if not set
$post_var = get_var($_POST['var']);

if (get_var($_GET['action']) == 'login') {
    //stuff
}
3
ответ дан 7 December 2019 в 12:12
поделиться

Когда $ _ REQUEST по умолчанию содержит содержимое $ _ GET и $ _ POST , зачем вам корпус переключателя. Вы можете использовать это напрямую и исключить $ superglobal :

function isset_and_is ($key, $value)
{
    return isset($_REQUEST[$key]) && ($_REQUEST[$key] == $value);
}
-1
ответ дан 7 December 2019 в 12:12
поделиться

Если вам нужно получить только один источник, используйте ответ Тома.

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

Вы можете использовать $_REQUEST, но я бы не рекомендовал этого делать. Порядок, в котором он рассматривает данные POST и GET, настраивается php.ini и включает другие источники.

Выполните что-нибудь вроде:

$data = array_merge($_GET, $_POST); //POST has precedence

а затем получите данные из $data.

2
ответ дан 7 December 2019 в 12:12
поделиться

Как насчет: http://www.php.net/manual/en/function.filter-input.php

function isset_and_is ($superglobal, $key, $value) {
  switch($superglobal) {
    case 'post':
      $type = INPUT_POST;
      break;
    case 'get':
      $type = INPUT_GET;
      break;
  }
  $var = filter_input($type,$key);
  if(is_null($var)) return false;
  return($var == $value);
}
1
ответ дан 7 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: