2015-02-06 88 views
0

我有一个使用TNetsharingmanager工具启用和禁用通过NIC卡通信的delphi porgram。它在Windows XP和7上运行得非常完美,但不会在Windows 8和10上运行。当我的程序在启动时尝试连接第一个可用NIC卡时,它不断提高“拒绝访问”错误。我似乎无法弄清楚这一点。我想也许是因为当前用户没有权限进行连接,但事实并非如此。我甚至以管理员身份运行我的程序,但仍然引发错误。一旦你确定错误框,我的程序继续没有问题。TNetSharingManager和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; 

回答

0

我原本以为我的安装程序以管理员身份运行,但显然我没有这样做是正确的。一旦我做了以下,该访问被拒绝的消息去 了。

要使用完全管理员访问令牌

  1. 找到程序图标或Windows资源管理器的快捷方式运行应用程序一次。

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

    当显示UAC消息,请执行下列操作之一:

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