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;
我以为我已经将我的程序设置为 运行 作为管理员,但显然我没有做对。一旦我执行了以下操作,访问被拒绝的消息就消失了
离开。
到 运行 一个具有完整管理员访问令牌的应用程序一次
在 Windows 资源管理器中找到程序图标或快捷方式。
右键单击程序图标或快捷方式,然后单击运行作为
管理员。
显示 UAC 消息时,执行以下操作之一:
- 如果您以标准用户身份登录,或者如果 UAC 配置为
总是需要凭据,输入适当的管理
凭据,然后单击“确定”。
- 如果您以管理员身份登录且未配置 UAC
要始终需要凭据,请单击“是”启动应用程序。
我有一个 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;
我以为我已经将我的程序设置为 运行 作为管理员,但显然我没有做对。一旦我执行了以下操作,访问被拒绝的消息就消失了 离开。
到 运行 一个具有完整管理员访问令牌的应用程序一次
在 Windows 资源管理器中找到程序图标或快捷方式。
右键单击程序图标或快捷方式,然后单击运行作为 管理员。
显示 UAC 消息时,执行以下操作之一:
- 如果您以标准用户身份登录,或者如果 UAC 配置为 总是需要凭据,输入适当的管理 凭据,然后单击“确定”。
- 如果您以管理员身份登录且未配置 UAC 要始终需要凭据,请单击“是”启动应用程序。