See the question and my original answer on StackOverflow

The 3 last parameters are declared out, which means you must not initialize them, but pass correct pointer so the function can allocate things for you.

Also, from what I understand reading the function doc, the binary one and the string one are mutually exclusive, so let's say you want to get back the binary one, then you can define the API like this ([in] are usually implicit):

    [DllImport("netapi32.dll", CharSet = CharSet.Unicode)]
    public static extern int NetProvisionComputerAccount(
        string lpDomain,
        string lpMachineName,
        string lpMachineAccountOU,
        string lpDcName,
        int dwOptions,
        out IntPtr pProvisionBinData,
        out int pdwProvisionBinDataSize,
        IntPtr pProvisionTextData);

Note the function does not use SetLastError, so don't declare it in the declaration.

And here is how to call it:

        string domain = "MyDomain.MyCompany.com";
        string machineName = "user1-pc";
        string machineAccoutOU = null;
        string dcName = "MyDomain";
        // I suggest you don't use hardcoded values to be nice with readers
        const int NETSETUP_PROVISION_DOWNLEVEL_PRIV_SUPPORT = 1;

        int status = NetProvisionComputerAccount(
            domain,
            machineName,
            machineAccoutOU,
            dcName,
            NETSETUP_PROVISION_DOWNLEVEL_PRIV_SUPPORT,
            out IntPtr binData, // let the system allocate the binary thing
            out int binDataSize, // this will be the size of the binary thing
            IntPtr.Zero); // we don't use this one here, pass null

I can't test further (I get error 1354 which I suppose is normal in my context).

Note the doc doesn't say anything about deallocating what the function allocates (if it allocates something? there are some rare Windows API that use static buffers they own). I think you're supposed to call NetApiBufferFree on binData once all work is done, but it's just a guess.