从C#托管代码调用win32 CreateProfile()

快速问题(希望如此),如何从C#(托管代码)正确调用win32函数CreateProfile()? 我试图自己设计一个解决方案但没有用。

CreateProfile()的语法是:

HRESULT WINAPI CreateProfile( __in LPCWSTR pszUserSid, __in LPCWSTR pszUserName, __out LPWSTR pszProfilePath, __in DWORD cchProfilePath ); 

支持文档可以在MSDN库中找到。

我到目前为止的代码发布在下面。

DLL导入:

 [DllImport("userenv.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern int CreateProfile( [MarshalAs(UnmanagedType.LPWStr)] string pszUserSid, [MarshalAs(UnmanagedType.LPWStr)] string pszUserName, [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath); 

调用函数:

 /* Assume that a user has been created using: net user TestUser password /ADD */ // Get the SID for the user TestUser NTAccount acct = new NTAccount("TestUser"); SecurityIdentifier si = (SecurityIdentifier)acct.Translate(typeof(SecurityIdentifier)); String sidString = si.ToString(); // Create string buffer StringBuilder pathBuf = new StringBuilder(260); uint pathLen = (uint)pathBuf.Capacity; // Invoke function int result = CreateProfile(sidString, "TestUser", pathBuf, pathLen); 

问题是没有创建用户配置文件,CreateProfile()返回错误代码: 0x800706f7 。 关于此事的任何有用信息都非常受欢迎。

谢谢,
-Sean

更新:解决了! pszProfilePath的字符串缓冲区的长度不能超过260。

对于out参数,您应该设置编组。 更重要的是,通过传递StringBuilder,您已经隐式地拥有一个输出参数。 因此,它应该成为:

 [DllImport("userenv.dll", CharSet = CharSet.Auto)] private static extern int CreateProfile( [MarshalAs(UnmanagedType.LPWStr)] string pszUserSid, [MarshalAs(UnmanagedType.LPWStr)] string pszUserName, [Out][MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszProfilePath, uint cchProfilePath); 

调用此方法:

 int MAX_PATH = 260; StringBuilder pathBuf = new StringBuilder(MAX_PATH); uint pathLen = (uint)pathBuf.Capacity; int result = CreateProfile(sidString, "TestUser", pathBuf, pathLen); 

它可能不是唯一的问题,但您需要将[Out]属性添加到DLL导入声明中的pszProfilePath参数。