2010-06-10 3 views
2

La séquence est comme suit:Appel AuditQuerySystemPolicy() (advapi32.dll) des déclarations de C# "Le paramètre est incorrect"

Tous ces travaux et le rendement attendu, les valeurs sensibles à l'exception du dernier. Appeler AuditQuerySystemPolicy() me obtient une erreur "Le paramètre est incorrect". Je pense qu'il doit y avoir un problème subtil d'unmarshaling. Je suis probablement mal interpréter ce qui exactement AuditEnumerateSubCategories() renvoie, mais je suis perplexe.

Vous verrez (commenté) J'ai essayé de déréférencer le pointeur de retour de AuditEnumerateSubCategories() comme un pointeur. Faire ou ne pas faire ça donne le même résultat.

code:

#region LSA types 
public enum POLICY_INFORMATION_CLASS 
{ 
    PolicyAuditLogInformation = 1, 
    PolicyAuditEventsInformation, 
    PolicyPrimaryDomainInformation, 
    PolicyPdAccountInformation, 
    PolicyAccountDomainInformation, 
    PolicyLsaServerRoleInformation, 
    PolicyReplicaSourceInformation, 
    PolicyDefaultQuotaInformation, 
    PolicyModificationInformation, 
    PolicyAuditFullSetInformation, 
    PolicyAuditFullQueryInformation, 
    PolicyDnsDomainInformation 
} 

public enum POLICY_AUDIT_EVENT_TYPE 
{ 
    AuditCategorySystem, 
    AuditCategoryLogon, 
    AuditCategoryObjectAccess, 
    AuditCategoryPrivilegeUse, 
    AuditCategoryDetailedTracking, 
    AuditCategoryPolicyChange, 
    AuditCategoryAccountManagement, 
    AuditCategoryDirectoryServiceAccess, 
    AuditCategoryAccountLogon 
} 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct POLICY_AUDIT_EVENTS_INFO 
{ 
    public bool AuditingMode; 
    public IntPtr EventAuditingOptions; 
    public UInt32 MaximumAuditEventCount; 
} 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
public struct GUID 
{ 
    public UInt32 Data1; 
    public UInt16 Data2; 
    public UInt16 Data3; 
    public Byte Data4a; 
    public Byte Data4b; 
    public Byte Data4c; 
    public Byte Data4d; 
    public Byte Data4e; 
    public Byte Data4f; 
    public Byte Data4g; 
    public Byte Data4h; 

    public override string ToString() 
    { 
     return Data1.ToString("x8") + "-" + Data2.ToString("x4") + "-" + Data3.ToString("x4") + "-" 
       + Data4a.ToString("x2") + Data4b.ToString("x2") + "-" 
       + Data4c.ToString("x2") + Data4d.ToString("x2") + Data4e.ToString("x2") + Data4f.ToString("x2") + Data4g.ToString("x2") + Data4h.ToString("x2"); 
    } 
} 
#endregion 

#region LSA Imports 
[DllImport("kernel32.dll")] 
extern static int GetLastError(); 

[DllImport("advapi32.dll", CharSet = CharSet.Unicode, PreserveSig = true)] 
public static extern UInt32 LsaNtStatusToWinError(
    long Status); 

[DllImport("advapi32.dll", CharSet = CharSet.Unicode, PreserveSig = true)] 
public static extern long LsaOpenPolicy(
    ref LSA_UNICODE_STRING SystemName, 
    ref LSA_OBJECT_ATTRIBUTES ObjectAttributes, 
    Int32 DesiredAccess, 
    out IntPtr PolicyHandle); 

[DllImport("advapi32.dll", CharSet = CharSet.Unicode, PreserveSig = true)] 
public static extern long LsaClose(IntPtr PolicyHandle); 

[DllImport("advapi32.dll", CharSet = CharSet.Unicode, PreserveSig = true)] 
public static extern long LsaFreeMemory(IntPtr Buffer); 

[DllImport("advapi32.dll", CharSet = CharSet.Unicode, PreserveSig = true)] 
public static extern void AuditFree(IntPtr Buffer); 

[DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] 
public static extern long LsaQueryInformationPolicy(
    IntPtr PolicyHandle, POLICY_INFORMATION_CLASS InformationClass, 
    out IntPtr Buffer); 

[DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] 
public static extern bool AuditLookupCategoryGuidFromCategoryId(
    POLICY_AUDIT_EVENT_TYPE AuditCategoryId, 
    IntPtr pAuditCategoryGuid); 

[DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] 
public static extern bool AuditEnumerateSubCategories(
    IntPtr pAuditCategoryGuid, 
    bool bRetrieveAllSubCategories, 
    out IntPtr ppAuditSubCategoriesArray, 
    out ulong pCountReturned); 

[DllImport("advapi32.dll", SetLastError = true, PreserveSig = true)] 
public static extern bool AuditQuerySystemPolicy(
    IntPtr pSubCategoryGuids, 
    ulong PolicyCount, 
    out IntPtr ppAuditPolicy); 
#endregion 

Dictionary<string, UInt32> retList = new Dictionary<string, UInt32>(); 
long lretVal; 
uint retVal; 

IntPtr pAuditEventsInfo; 
lretVal = LsaQueryInformationPolicy(policyHandle, POLICY_INFORMATION_CLASS.PolicyAuditEventsInformation, out pAuditEventsInfo); 
retVal = LsaNtStatusToWinError(lretVal); 
if (retVal != 0) 
{ 
    LsaClose(policyHandle); 
    throw new System.ComponentModel.Win32Exception((int)retVal); 
} 

POLICY_AUDIT_EVENTS_INFO myAuditEventsInfo = new POLICY_AUDIT_EVENTS_INFO(); 
myAuditEventsInfo = (POLICY_AUDIT_EVENTS_INFO)Marshal.PtrToStructure(pAuditEventsInfo, myAuditEventsInfo.GetType()); 

IntPtr subCats = IntPtr.Zero; 
ulong nSubCats = 0; 

for (int audCat = 0; audCat < myAuditEventsInfo.MaximumAuditEventCount; audCat++) 
{ 
    GUID audCatGuid = new GUID(); 
    if (!AuditLookupCategoryGuidFromCategoryId((POLICY_AUDIT_EVENT_TYPE)audCat, new IntPtr(&audCatGuid))) 
    { 
     int causingError = GetLastError(); 
     LsaFreeMemory(pAuditEventsInfo); 
     LsaClose(policyHandle); 
     throw new System.ComponentModel.Win32Exception(causingError); 
    } 

    if (!AuditEnumerateSubCategories(new IntPtr(&audCatGuid), true, out subCats, out nSubCats)) 
    { 
     int causingError = GetLastError(); 
     LsaFreeMemory(pAuditEventsInfo); 
     LsaClose(policyHandle); 
     throw new System.ComponentModel.Win32Exception(causingError); 
    } 

    // Dereference the first pointer-to-pointer to point to the first subcategory 
    // subCats = (IntPtr)Marshal.PtrToStructure(subCats, subCats.GetType()); 

    if (nSubCats > 0) 
    { 
     IntPtr audPolicies = IntPtr.Zero; 
     if (!AuditQuerySystemPolicy(subCats, nSubCats, out audPolicies)) 
     { 
      int causingError = GetLastError(); 
      if (subCats != IntPtr.Zero) 
       AuditFree(subCats); 
      LsaFreeMemory(pAuditEventsInfo); 
      LsaClose(policyHandle); 
      throw new System.ComponentModel.Win32Exception(causingError); 
     } 

     AUDIT_POLICY_INFORMATION myAudPol = new AUDIT_POLICY_INFORMATION(); 
     for (ulong audSubCat = 0; audSubCat < nSubCats; audSubCat++) 
     { 
      // Process audPolicies[audSubCat], turn GUIDs into names, fill retList. 
      // http://msdn.microsoft.com/en-us/library/aa373931%28VS.85%29.aspx 
      // http://msdn.microsoft.com/en-us/library/bb648638%28VS.85%29.aspx 

      IntPtr itemAddr = IntPtr.Zero; 
      IntPtr itemAddrAddr = new IntPtr(audPolicies.ToInt64() + (long)(audSubCat * (ulong)Marshal.SizeOf(itemAddr))); 
      itemAddr = (IntPtr)Marshal.PtrToStructure(itemAddrAddr, itemAddr.GetType()); 
      myAudPol = (AUDIT_POLICY_INFORMATION)Marshal.PtrToStructure(itemAddr, myAudPol.GetType()); 
      retList[myAudPol.AuditSubCategoryGuid.ToString()] = myAudPol.AuditingInformation; 
     } 

     if (audPolicies != IntPtr.Zero) 
      AuditFree(audPolicies); 
    } 

    if (subCats != IntPtr.Zero) 
     AuditFree(subCats); 

    subCats = IntPtr.Zero; 
    nSubCats = 0; 
} 

lretVal = LsaFreeMemory(pAuditEventsInfo); 
retVal = LsaNtStatusToWinError(lretVal); 
if (retVal != 0) 
    throw new System.ComponentModel.Win32Exception((int)retVal); 

lretVal = LsaClose(policyHandle); 
retVal = LsaNtStatusToWinError(lretVal); 
if (retVal != 0) 
    throw new System.ComponentModel.Win32Exception((int)retVal); 

Répondre

1

tout d'abord vous afficher le code pas plein, donc je ne peux pas le compiler. Il n'y a pas de code à ouvrir policyHandle avec la fonction LsaOpenPolicy. déclaration de certaines structures comme AUDIT_POLICY_INFORMATION, LSA_OBJECT_ATTRIBUTES et LSA_UNICODE_STRING également absent.

Néanmoins, j'ai trouvé au moins une erreur dans votre code. L'utilisation du dernier paramètre de AuditLookupCategoryGuidFromCategoryId me semble faux. La fonction AuditLookupCategoryGuidFromCategoryId a prototype

BOOLEAN WINAPI AuditLookupCategoryGuidFromCategoryId(
    __in POLICY_AUDIT_EVENT_TYPE AuditCategoryId, 
    __out GUID *pAuditCategoryGuid 
); 

ce qui signifie, vous devez allouer la mémoire non géré pour maintenir GUID et obtenir pointeur sur AuditLookupCategoryGuidFromCategoryId. La mémoire sera renseignée par AuditLookupCategoryGuidFromCategoryId. Ainsi, au lieu de

GUID audCatGuid = new GUID(); 
if (!AuditLookupCategoryGuidFromCategoryId((POLICY_AUDIT_EVENT_TYPE)audCat, 
              new IntPtr(&audCatGuid))) 
// ... 
if (!AuditEnumerateSubCategories(new IntPtr(&audCatGuid), true, out subCats, 
           out nSubCats)) 
// ... 

me semble corriger ce qui suit

IntPtr pAuditCatGuid = Marshal.AllocHGlobal (Marshal.SizeOf(GUID)); 
if (!AuditLookupCategoryGuidFromCategoryId((POLICY_AUDIT_EVENT_TYPE)audCat, 
              pAuditCatGuid)) 
// ... 
if (!AuditEnumerateSubCategories(pAuditCatGuid, true, out subCats, 
           out nSubCats)) 
// ... 
Questions connexes