public Dictionary <string, SecurityDescriptor> QueryHttpNamespaceAcls() { Dictionary <string, SecurityDescriptor> nsTable = new Dictionary <string, SecurityDescriptor>(); HTTP_SERVICE_CONFIG_URLACL_QUERY query = new HTTP_SERVICE_CONFIG_URLACL_QUERY { QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryNext }; IntPtr pQuery = Marshal.AllocHGlobal(Marshal.SizeOf(query)); try { uint retval; for (query.dwToken = 0;; query.dwToken++) { Marshal.StructureToPtr(query, pQuery, false); try { uint returnSize = 0; // Get Size retval = HttpQueryServiceConfiguration(IntPtr.Zero, HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, pQuery, (uint)Marshal.SizeOf(query), IntPtr.Zero, 0, ref returnSize, IntPtr.Zero); if (retval == ERROR_NO_MORE_ITEMS) { break; } if (retval != ERROR_INSUFFICIENT_BUFFER) { throw new Exception("HttpQueryServiceConfiguration returned unexpected error code."); } IntPtr pConfig = Marshal.AllocHGlobal((IntPtr)returnSize); try { retval = HttpQueryServiceConfiguration(IntPtr.Zero, HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, pQuery, (uint)Marshal.SizeOf(query), pConfig, returnSize, ref returnSize, IntPtr.Zero); if (retval == NO_ERROR) { HTTP_SERVICE_CONFIG_URLACL_SET config = (HTTP_SERVICE_CONFIG_URLACL_SET)Marshal.PtrToStructure(pConfig, typeof(HTTP_SERVICE_CONFIG_URLACL_SET)); nsTable.Add(config.KeyDesc.pUrlPrefix, SecurityDescriptor.SecurityDescriptorFromString(config.ParamDesc.pStringSecurityDescriptor)); } } finally { Marshal.FreeHGlobal(pConfig); } } finally { Marshal.DestroyStructure(pQuery, typeof(HTTP_SERVICE_CONFIG_URLACL_QUERY)); } } if (retval != ERROR_NO_MORE_ITEMS) { throw new Exception("HttpQueryServiceConfiguration returned unexpected error code."); } } finally { Marshal.FreeHGlobal(pQuery); } return(nsTable); }