从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
参数。