簡體   English   中英

部署 .NET 應用程序時 - 您如何找出共享相對於運行應用程序的計算機所在的區域?

[英]When deploying .NET applications - how do you find out what zone a share is in relative to the computer running the application?

使用 .NET 的任何版本,您如何找出特定共享屬於哪個區域。 我在識別我引用的 dll 所在的共享是否位於相對於運行我的 .NET 應用程序的某些用戶計算機的“內部網區域”或“互聯網”區域時遇到問題。 我懷疑這是一個問題,因為我在從某些機器上的共享訪問引用的 dll 時遇到問題,但在其他機器上卻沒有。 我怎樣才能知道 .NET 將該共享歸入哪個區域,以便我可以相應地調整權限?

以編程方式,您可以使用IInteretSecurty::MapZoneToUrl ,它是一個 COM 接口。 PInvoke.net 上有一個從 C# 和 Z6145AFC977C7 660083BDCDDEA91B7D09Z定義和調用它的示例。

我基於 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM