部署.NET应用程序时,如何确定共享相对于运行该应用程序的计算机所处的区域
本文关键字:应用程序 计算机 区域 运行 共享 NET 部署 何确定 相对于 | 更新日期: 2023-09-27 17:58:38
使用任何版本的.NET,如何找出特定共享的分类区域。我在识别我引用的dll所在的共享是否位于相对于运行我的.NET应用程序的某个用户计算机的"intranet区域"或"internet"区域时遇到问题。我怀疑这是一个问题,因为我在某些机器上从共享访问引用的dll时遇到问题,而在其他机器上则不然。我如何判断.NET将该共享分类在哪个区域中,以便相应地调整权限?
您可以通过编程使用IInteretSecurity::MapZoneToUrl,这是一个COM接口。PInvoke.net中有一个从C#和Vb.net.定义和调用它的例子
我基于pinvoke.net示例和MSDN示例创建并测试了一个从C#调用MapZoneToUrl的简单示例。
url需要以http://或https://开头,否则会出现E_INVALIDARG错误,所以我不知道这对检查网络共享意味着什么。
public static class InternetSecurityManager
{
private static Guid _CLSID_SecurityManager = new Guid("7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4");
private static string[] ZoneNames = new[] { "Local", "Intranet", "Trusted", "Internet", "Restricted" };
public static string GetUrlZone(string url)
{
Type t = System.Type.GetTypeFromCLSID(_CLSID_SecurityManager);
IInternetSecurityManager securityManager = (IInternetSecurityManager)System.Activator.CreateInstance(t);
try
{
uint zone = 0;
int hResult = securityManager.MapUrlToZone(url, ref zone, 0);
if (hResult != 0)
throw new COMException("Error calling MapUrlToZone, HRESULT = " + hResult.ToString("x"), hResult);
if (zone < ZoneNames.Length)
return ZoneNames[zone];
return "Unknown - " + zone;
}
finally
{
Marshal.ReleaseComObject(securityManager);
}
}
}
[ComImport, GuidAttribute("79EAC9EE-BAF9-11CE-8C82-00AA004BA90B")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IInternetSecurityManager
{
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int SetSecuritySite([In] IntPtr pSite);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int GetSecuritySite([Out] IntPtr pSite);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int MapUrlToZone([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
ref UInt32 pdwZone, UInt32 dwFlags);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int GetSecurityId([MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pbSecurityId,
ref UInt32 pcbSecurityId, uint dwReserved);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int ProcessUrlAction([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
UInt32 dwAction, out byte pPolicy, UInt32 cbPolicy,
byte pContext, UInt32 cbContext, UInt32 dwFlags,
UInt32 dwReserved);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int QueryCustomPolicy([In, MarshalAs(UnmanagedType.LPWStr)] string pwszUrl,
ref Guid guidKey, ref byte ppPolicy, ref UInt32 pcbPolicy,
ref byte pContext, UInt32 cbContext, UInt32 dwReserved);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int SetZoneMapping(UInt32 dwZone,
[In, MarshalAs(UnmanagedType.LPWStr)] string lpszPattern,
UInt32 dwFlags);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int GetZoneMappings(UInt32 dwZone, out UCOMIEnumString ppenumString,
UInt32 dwFlags);
}