TNetSharingManager和Windows 8& 10:访问被拒绝

时间:2015-02-06 17:29:10

标签: windows delphi networking access-denied nic

我有一个delphi porgram使用TNetsharingmanager工具来启用和禁用通过NIC卡的通信。它在Windows XP和Windows 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;

1 个答案:

答案 0 :(得分:0)

我以为我已将我的程序设置为以管理员身份运行,但显然我做得不对。完成以下操作后,该访问被拒绝的消息就消失了 程。

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

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

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

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

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