TNetSharingManager и Windows 8 & 10: доступ запрещен

У меня есть Delphi Porgram, который использует инструмент TNetsharingmanager для включения и отключения связи через сетевую карту. Он работал безупречно в Windows XP и 7, но не в Windows 8 и 10. Он продолжает выдавать ошибку "Отказано в доступе", когда моя программа пытается подключиться к первой доступной сетевой карте при запуске. Я не могу понять это. Я подумал, может быть, потому что у текущего пользователя нет разрешения на подключение, но это не так. Я даже запустил свою программу как администратор и все еще выдает ошибку. Как только вы исправите окно с ошибкой, моя программа продолжит работу без проблем.

Вот код, который я использую:

procedure TDXCommdlg.GetConnectionList(Strings,IdList: TStrings);
var
   pEnum: IEnumVariant;
   vNetCon: OleVARIANT;
   dwRetrieved: Cardinal;
   pUser: NETCONLib_TLB.PUserType1;
   NetCon : INetConnection;
begin
   Strings.Clear;
   IdList.Clear;
   pEnum := (NetSharingManager1.EnumEveryConnection._NewEnum as IEnumVariant);
   while (pEnum.Next(1, vNetCon, dwRetrieved) = S_OK) do
   begin
       (IUnknown(vNetCon) as INetConnection).GetProperties(pUser);
       NetCon := (IUnknown(vNetCon) as INetConnection);

       if (pUser.Status in [NCS_CONNECTED,NCS_CONNECTING])
       and (pUser.MediaType in [NCM_LAN,NCM_SHAREDACCESSHOST_LAN,NCM_ISDN] )
       and (GetMacAddress(GuidToString(pUser.guidId))<>'' ) then
       begin
           //we only want valid network cards that are enabled
           Strings.Add(pUser.pszwName);
           IdList.Add(GuidToString(pUser.guidId));
       end;
   end;
end;

function TDXCommdlg.GetMacAddress(CardID: string): String;
var
    Reg: TRegistry;
    KeyValues: TSTringList;
    i: integer;
    CardInstanceID,CardAddress: string;
begin
    Result := '';
    Reg := TRegistry.Create;
    KeyValues := TStringList.Create;
    try
       Reg.RootKey:=HKEY_LOCAL_MACHINE;
       if Reg.OpenKey(MacLocation,false) then
       begin
          Reg.GetKeyNames(KeyValues);
          Reg.CloseKey;

          for i := 0 to KeyValues.Count-1 do
             if reg.OpenKey(MacLocation+'\'+KeyValues[i],false) then
             begin
                 CardInstanceID := Reg.ReadString('NetCfgInstanceId');
                 CardAddress := Reg.ReadString('NetworkAddress');
                 Reg.CloseKey;

                 if CardInstanceID = CardId then
                 begin
                     if CardAddress='' then CardAddress := 'Hardware';
                         Result := CardAddress;
                     break;
                 end;
              end;
          end;
      finally
      Reg.Free;
      KeyValues.Free;
  end;
end;

procedure TDXCommdlg.ResetNIC(const aConnection: string);
var
   pEnum: IEnumVariant;
   vNetCon: OleVARIANT;
   dwRetrieved: Cardinal;
   pUser: NETCONLib_TLB.PUserType1;
begin
   enabled := false;
   try
       pEnum := (NetSharingManager1.EnumEveryConnection._NewEnum as IEnumVariant);
   while (pEnum.Next(1, vNetCon, dwRetrieved) = S_OK) do
   begin
        (IUnknown(vNetCon) as INetConnection).GetProperties(pUser);
        if pUser.pszwName = aConnection then
        begin
            (IUnknown(vNetCon) as INetConnection).Disconnect;
            (IUnknown(vNetCon) as INetConnection).Connect;
            sleep(2000);
            break;
        end;
   end;
   finally
   enabled := true;
 end;
end;

1 ответ

Решение

Я думал, что настроил свою программу для запуска с правами администратора, но, видимо, я сделал это неправильно Как только я сделал следующее, сообщение об отказе в доступе исчезло.

Чтобы запустить приложение один раз с маркером полного доступа администратора

  1. Найдите значок программы или ярлык в проводнике Windows.

  2. Щелкните правой кнопкой мыши значок программы или ярлык, а затем выберите "Запуск от имени администратора".

    Когда появится сообщение UAC, выполните одно из следующих действий:

    • Если вы вошли в систему как обычный пользователь или если UAC настроен так, чтобы всегда требовать учетные данные, введите соответствующие административные учетные данные и нажмите кнопку ОК.
    • Если вы вошли в систему как администратор и UAC не настроен так, чтобы всегда требовать учетные данные, нажмите кнопку Да, чтобы запустить приложение.
Другие вопросы по тегам