/// <summary>
        /// Deletes a group
        /// </summary>
        /// <param name="groupName"></param>
        public static void DeleteGroup(string groupName)
        {
            int returnCode = Win32GroupInterop.NetLocalGroupDel(null, groupName);

            switch (returnCode)
            {
            case Win32GroupInterop.ReturnCode.S_OK:
            case Win32GroupInterop.ReturnCode.ERROR_NO_SUCH_ALIAS:
            case Win32GroupInterop.ReturnCode.NERR_GroupNotFound:
                break;

            default:
                throw new Exception(string.Format("DeleteGroup failed: {0}", returnCode));
            }
        }
        /// <summary>
        /// Removes a user from the named group
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="userName"></param>
        public static void RemoveMemberFromGroup(string groupName, string userName)
        {
            Win32GroupInterop.LocalGroupMemberInfo memberInfo = new Win32GroupInterop.LocalGroupMemberInfo();
            memberInfo.FullName = userName;

            int returnCode = Win32GroupInterop.NetLocalGroupDelMembers(null, groupName, 3, ref memberInfo, 1);

            switch (returnCode)
            {
            case Win32GroupInterop.ReturnCode.S_OK:
            case Win32GroupInterop.ReturnCode.ERROR_MEMBER_NOT_IN_ALIAS:
                break;

            default:
                throw new Exception(string.Format("RemoveMemberFromGroup failed: {0}", returnCode));
            }
        }
        /// <summary>
        /// Creates a group
        /// </summary>
        /// <param name="groupName"></param>
        /// <param name="groupComment"></param>
        public static void CreateGroup(string groupName, string groupComment)
        {
            Win32GroupInterop.LocalGroupInfo groupInfo = new Win32GroupInterop.LocalGroupInfo();
            groupInfo.Name    = groupName;
            groupInfo.Comment = groupComment;

            int returnCode = Win32GroupInterop.NetLocalGroupAdd(null, 1, ref groupInfo, 0);

            switch (returnCode)
            {
            case Win32GroupInterop.ReturnCode.S_OK:
            case Win32GroupInterop.ReturnCode.ERROR_ALIAS_EXISTS:
            case Win32GroupInterop.ReturnCode.NERR_GroupExists:
                break;

            default:
                throw new Exception(string.Format("CreateGroup failed: {0}", returnCode));
            }
        }
        public static int TryGetSidsOfLocalGroupMembers(string serverName, string localGroupName, out List <SecurityIdentifier> sids)
        {
            if (string.IsNullOrEmpty(localGroupName))
            {
                throw new ArgumentNullException("localGroupName");
            }

            sids = new List <SecurityIdentifier>();

            // Note: serverName can be (and usually is) null.
            uint   entriesRead;
            uint   totalEntries;
            IntPtr resumeHandle = IntPtr.Zero;
            IntPtr bufPtr       = IntPtr.Zero;

            try
            {
                int returnCode = Win32GroupInterop.NetLocalGroupGetMembers(serverName,
                                                                           localGroupName,
                                                                           0,             // level 0. return the security identifier (SID) associated with the local group member. The bufptr parameter points to an array of LOCALGROUP_MEMBERS_INFO_0 structures
                                                                           out bufPtr,
                                                                           uint.MaxValue, // maximum preferred length. The method MUST allocate as much space as the data requires.
                                                                           out entriesRead,
                                                                           out totalEntries,
                                                                           out resumeHandle);

                if (returnCode != Win32GroupInterop.ReturnCode.S_OK)
                {
                    return(returnCode);
                    //if (returnCode == Win32GroupInterop.ReturnCode.ERROR_ACCESS_DENIED)
                    //{
                    //    //throw new UnauthorizedAccessException(AdminResources.AccessDenied());
                    //}
                    //else if (returnCode == Win32GroupInterop.ReturnCode.NERR_GroupNotFound ||
                    //         returnCode == Win32GroupInterop.ReturnCode.ERROR_NO_SUCH_ALIAS)
                    //{
                    //    //throw new ArgumentException(AdminResources.GroupNotExist(), "localGroupName");
                    //}

                    ////throw new ConfigurationException(AdminResources.ErrorOperationWithReturnCode("NetLocalGroupGetMembers", returnCode.ToString(CultureInfo.CurrentCulture)));
                }

                for (int index = 0; index < entriesRead; ++index)
                {
                    IntPtr ptr = new IntPtr((long)bufPtr + Marshal.SizeOf(typeof(Win32GroupInterop.LocalGroupMemberInfo0)) * index);

                    Win32GroupInterop.LocalGroupMemberInfo0 groupMemberInfo =
                        (Win32GroupInterop.LocalGroupMemberInfo0)Marshal.PtrToStructure(ptr, typeof(Win32GroupInterop.LocalGroupMemberInfo0));

                    SecurityIdentifier sid = new SecurityIdentifier(groupMemberInfo.Sid);

                    sids.Add(sid);
                }

                return(Win32GroupInterop.ReturnCode.S_OK);
            }
            finally
            {
                if (bufPtr != IntPtr.Zero)
                {
                    int rc = Win32GroupInterop.NetApiBufferFree(bufPtr);

                    if (rc != Win32GroupInterop.ReturnCode.S_OK)
                    {
                        TraceManager.TraceError("Failed to free buffer returned by NetLocalGroupGetMembers(). Error: {0}", rc);
                    }
                }
            }
        }