static string GetClusterName(SafeHCluster hCluster)
 {
     if (clusterName == null)
     {
         uint cch = 255u;
         StringBuilder sb = new StringBuilder((int)cch);
         int ret = SafeNativeMethods.GetClusterInformation(
             hCluster,
             sb,
             ref cch,
             IntPtr.Zero);
         if (ret != SafeNativeMethods.ERROR_SUCCESS || ret == SafeNativeMethods.ERROR_MORE_DATA)
         {
             if (ret == SafeNativeMethods.ERROR_MORE_DATA)
             {
                 sb = new StringBuilder((int)cch);
                 ret = SafeNativeMethods.GetClusterInformation(
                                                 hCluster,
                                                 sb,
                                                 ref cch,
                                                 IntPtr.Zero);
                 if (ret != SafeNativeMethods.ERROR_SUCCESS)
                 {
                     return null;
                 }
             }
         }
         clusterName = sb.ToString();
     }
     return clusterName;
 }
        internal static SafeHResource GetTransactionManagerClusterResource(string virtualServerName, out string[] nodes)
        {
            nodes = null;

#pragma warning suppress 56523
            SafeHCluster hCluster = SafeNativeMethods.OpenCluster(null);
            if (hCluster.IsInvalid)
            {
                return null;
            }

            using (hCluster)
            {
                //W2k3 cluster
                if (Utilities.OSMajor <= 5)
                {
                    if (Utilities.IsLocalMachineName(virtualServerName))
                    {
                        virtualServerName = GetClusterName(hCluster);
                    }
                }
#pragma warning suppress 56523
                SafeHClusEnum hEnum = SafeNativeMethods.ClusterOpenEnum(hCluster, ClusterEnum.Resource);
                if (hEnum.IsInvalid)
                {
                    return null;
                }

                using (hEnum)
                {
                    uint index = 0;
                    bool moreToEnumerate;
                    SafeHResource hResource;
                    do
                    {
                        string theResourceName = string.Empty; 
                        moreToEnumerate = GetResourceFromEnumeration(hCluster, hEnum, index, out hResource, out theResourceName);
                        if (moreToEnumerate)
                        {                            
                            if (IsTransactionManager(hResource))
                            {
                                string networkName = GetResourceNetworkName(hResource);
                                Utilities.Log("Resource network name: " + networkName);
                                if (Utilities.SafeCompare(networkName, virtualServerName))
                                {
                                    nodes = GetClusterNodes(hCluster);
                                    return hResource;
                                }
                            }
                            hResource.Dispose();
                            index++;
                        }
                    } while (moreToEnumerate);
                }
            }

            return null;
        }
        internal static bool IsClusterServer(string machineName)
        {
#pragma warning suppress 56523
            SafeHCluster hCluster = SafeNativeMethods.OpenCluster(Utilities.IsLocalMachineName(machineName) ? null : machineName);
            bool result = false;
            using (hCluster)
            {
                result = !hCluster.IsInvalid;
            }
            return result;
        }
        internal static bool ResolveVirtualServerName(string machineName, string dtcResourceName, out string virtualServer)
        {
            virtualServer = string.Empty;
#pragma warning suppress 56523
            SafeHCluster hCluster = SafeNativeMethods.OpenCluster(Utilities.IsLocalMachineName(machineName) ? null : machineName);
            if (hCluster.IsInvalid)
            {
                return false;
            }

            using (hCluster)
            {
#pragma warning suppress 56523
                SafeHClusEnum hEnum = SafeNativeMethods.ClusterOpenEnum(hCluster, ClusterEnum.Resource);
                if (hEnum.IsInvalid)
                {
                    return false;
                }

                using (hEnum)
                {
                    uint index = 0;
                    bool moreToEnumerate;
                    SafeHResource hResource;
                    do
                    {
                        string theResourceName = string.Empty;
                        moreToEnumerate = GetResourceFromEnumeration(hCluster, hEnum, index, out hResource, out theResourceName);
                        if (moreToEnumerate)
                        {
                            if (IsTransactionManager(hResource))
                            {
                                if (string.CompareOrdinal(theResourceName, dtcResourceName) == 0)
                                {
                                    virtualServer = GetResourceNetworkName(hResource);
                                    return true;
                                }
                            }
                            hResource.Dispose();
                            index++;
                        }
                    } while (moreToEnumerate);
                }
            }
            return false;
        }
예제 #5
0
        static bool GetResourceFromEnumeration(SafeHCluster hCluster,
                                               SafeHClusEnum hEnum,
                                               uint index, out SafeHResource hResource, out string theResourceName)
        {
            uint type, cch = 0;

            hResource       = null;
            theResourceName = string.Empty;

            uint ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, null, ref cch);

            if (ret == SafeNativeMethods.ERROR_NO_MORE_ITEMS)
            {
                return(false);
            }
            else if (ret == SafeNativeMethods.ERROR_SUCCESS || ret == SafeNativeMethods.ERROR_MORE_DATA)
            {
                StringBuilder sb = new StringBuilder((int)(++cch));
                ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, sb, ref cch);

                if (ret == SafeNativeMethods.ERROR_SUCCESS)
                {
                    string resourceName = sb.ToString();

#pragma warning suppress 56523
                    hResource = SafeNativeMethods.OpenClusterResource(hCluster, resourceName);
                    if (hResource.IsInvalid)
                    {
                        hResource = null;
                    }
                    else
                    {
                        theResourceName = resourceName;
                    }
                }
            }

            return(true);
        }
        static string[] GetClusterNodes(SafeHCluster hCluster)
        {
#pragma warning suppress 56523
            SafeHClusEnum hEnum = SafeNativeMethods.ClusterOpenEnum(hCluster, ClusterEnum.Node);
            if (hEnum.IsInvalid)
            {
                return null;
            }

            List<string> nodeList = new List<string>(2); // 2 nodes are a typical cluster configuration            

            using (hEnum)
            {
                uint ret, index = 0;
                do
                {
                    uint type, cch = 0;
                    ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, null, ref cch);
                    if (ret == SafeNativeMethods.ERROR_NO_MORE_ITEMS)
                    {
                        break;
                    }
                    else if (ret == SafeNativeMethods.ERROR_SUCCESS || ret == SafeNativeMethods.ERROR_MORE_DATA)
                    {
                        StringBuilder sb = new StringBuilder((int)(++cch));
                        ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, sb, ref cch);
                        if (ret == SafeNativeMethods.ERROR_SUCCESS)
                        {
                            Utilities.Log("Found a node: [" + sb.ToString() + "]");
                            nodeList.Add(sb.ToString());
                        }
                    }
                    index++;
                } while (ret == SafeNativeMethods.ERROR_SUCCESS);
            }

            return nodeList.ToArray();
        }
예제 #7
0
        static string[] GetClusterNodes(SafeHCluster hCluster)
        {
#pragma warning suppress 56523
            SafeHClusEnum hEnum = SafeNativeMethods.ClusterOpenEnum(hCluster, ClusterEnum.Node);
            if (hEnum.IsInvalid)
            {
                return null;
            }

            List<string> nodeList = new List<string>(2); // 2 nodes are a typical cluster configuration            

            using (hEnum)
            {
                uint ret, index = 0;
                do
                {
                    uint type, cch = 0;
                    ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, null, ref cch);
                    if (ret == SafeNativeMethods.ERROR_NO_MORE_ITEMS)
                    {
                        break;
                    }
                    else if (ret == SafeNativeMethods.ERROR_SUCCESS || ret == SafeNativeMethods.ERROR_MORE_DATA)
                    {
                        StringBuilder sb = new StringBuilder((int)(++cch));
                        ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, sb, ref cch);
                        if (ret == SafeNativeMethods.ERROR_SUCCESS)
                        {
                            Utilities.Log("Found a node: [" + sb.ToString() + "]");
                            nodeList.Add(sb.ToString());
                        }
                    }
                    index++;
                } while (ret == SafeNativeMethods.ERROR_SUCCESS);
            }

            return nodeList.ToArray();
        }
예제 #8
0
        static bool GetResourceFromEnumeration(SafeHCluster hCluster,
                                               SafeHClusEnum hEnum,
                                               uint index, out SafeHResource hResource, out string theResourceName)
        {
            uint type, cch = 0;
            hResource = null;
            theResourceName = string.Empty;

            uint ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, null, ref cch);
            if (ret == SafeNativeMethods.ERROR_NO_MORE_ITEMS)
            {
                return false;
            }
            else if (ret == SafeNativeMethods.ERROR_SUCCESS || ret == SafeNativeMethods.ERROR_MORE_DATA)
            {
                StringBuilder sb = new StringBuilder((int)(++cch));
                ret = SafeNativeMethods.ClusterEnum(hEnum, index, out type, sb, ref cch);

                if (ret == SafeNativeMethods.ERROR_SUCCESS)
                {                    
                    string resourceName = sb.ToString();

#pragma warning suppress 56523
                    hResource = SafeNativeMethods.OpenClusterResource(hCluster, resourceName);
                    if (hResource.IsInvalid)
                    {
                        hResource = null;
                    }
                    else
                    {
                        theResourceName = resourceName;
                    }
                }
            }

            return true;
        }
예제 #9
0
 static string GetClusterName(SafeHCluster hCluster)
 {
     if (clusterName == null)
     {
         uint cch = 255u;
         StringBuilder sb = new StringBuilder((int)cch);
         int ret = SafeNativeMethods.GetClusterInformation(
             hCluster,
             sb,
             ref cch,
             IntPtr.Zero);
         if (ret != SafeNativeMethods.ERROR_SUCCESS || ret == SafeNativeMethods.ERROR_MORE_DATA)
         {
             if (ret == SafeNativeMethods.ERROR_MORE_DATA)
             {
                 sb = new StringBuilder((int)cch);
                 ret = SafeNativeMethods.GetClusterInformation(
                                                 hCluster,
                                                 sb,
                                                 ref cch,
                                                 IntPtr.Zero);
                 if (ret != SafeNativeMethods.ERROR_SUCCESS)
                 {
                     return null;
                 }
             }
         }
         clusterName = sb.ToString();
     }
     return clusterName;
 }
 internal static extern SafeHResource OpenClusterResource(
     [In] SafeHCluster hCluster,
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpszResourceName);
 internal static extern SafeHClusEnum ClusterOpenEnum(
     [In] SafeHCluster hCluster,
     [In] ClusterEnum dwType);
 internal static extern int GetClusterInformation(
     [In] SafeHCluster hCluster,
     [Out] StringBuilder lpszClusterName,
     [In, Out] ref uint lpcchClusterName,
     [In, Out] IntPtr lpClusterInfo
     );