2015-02-06 1 views
0

TNetsharingmanager 도구를 사용하여 NIC 카드를 통한 통신을 사용하거나 사용하지 않도록 설정하는 델파이 프로그램이 있습니다. 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가 항상 구성되어 있지 않은 경우 에 자격 증명이 항상 필요하면 예를 클릭하여 응용 프로그램을 시작합니다.
관련 문제