TNetSharingManager 和 Windows 8 & 10:拒绝访问

TNetSharingManager and Windows 8 & 10: Access Denied

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

这是我使用的代码:

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. 在 Windows 资源管理器中找到程序图标或快捷方式。

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

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

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