TNetSharingManager и Windows 8 & 10: доступ запрещен
У меня есть Delphi Porgram, который использует инструмент TNetsharingmanager для включения и отключения связи через сетевую карту. Он работал безупречно в Windows XP и 7, но не в 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;
1 ответ
Я думал, что настроил свою программу для запуска с правами администратора, но, видимо, я сделал это неправильно Как только я сделал следующее, сообщение об отказе в доступе исчезло.
Чтобы запустить приложение один раз с маркером полного доступа администратора
Найдите значок программы или ярлык в проводнике Windows.
Щелкните правой кнопкой мыши значок программы или ярлык, а затем выберите "Запуск от имени администратора".
Когда появится сообщение UAC, выполните одно из следующих действий:
- Если вы вошли в систему как обычный пользователь или если UAC настроен так, чтобы всегда требовать учетные данные, введите соответствующие административные учетные данные и нажмите кнопку ОК.
- Если вы вошли в систему как администратор и UAC не настроен так, чтобы всегда требовать учетные данные, нажмите кнопку Да, чтобы запустить приложение.