【问题标题】:TNetSharingManager and Windows 8 & 10: Access DeniedTNetSharingManager 和 Windows 8 和 10:拒绝访问
【发布时间】:2015-02-06 17:29:10
【问题描述】:

我有一个 delphi porgram,它使用 TNetsharingmanager 工具来启用和禁用通过 NIC 卡的通信。它在 Windows XP 和 7 上完美运行,但在 Windows 8 和 10 上却不行。当我的程序在启动时尝试连接到第一个可用的 NIC 卡时,它会不断引发“拒绝访问”错误。我似乎无法弄清楚这一点。我想可能是因为当前用户没有建立连接的权限,但事实并非如此。我什至以管理员身份运行我的程序,但仍然引发错误。一旦你确定了错误框,我的程序就会继续没有问题。

这是我使用的代码:

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;

【问题讨论】:

    标签: windows delphi networking access-denied nic


    【解决方案1】:

    我以为我已将程序设置为以管理员身份运行,但显然我做得不对。一旦我做了以下事情,拒绝访问的消息就消失了 离开。

    使用完整的管理员访问令牌运行一次应用程序

    1. 在 Windows 资源管理器中找到程序图标或快捷方式。

    2. 右键单击程序图标或快捷方式,然后单击运行方式 管理员。

      当显示 UAC 消息时,执行以下操作之一:

      • 如果您以标准用户身份登录,或者如果 UAC 配置为 始终需要凭据,请输入相应的管理 凭据,然后单击“确定”。
      • 如果您以管理员身份登录并且未配置 UAC 要始终要求凭据,请单击“是”启动应用程序。

    【讨论】:

      猜你喜欢
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多