快速提问(希望如此),如何从C#(托管代码)正确调用win32函数CreateProfile()?我试图自己设计一个解决方案但没有用。
CreateProfile()的语法是:
HRESULT WINAPI CreateProfile(
__in LPCWSTR pszUserSid,
__in LPCWSTR pszUserName,
__out LPWSTR pszProfilePath,
__in DWORD cchProfilePath
);
支持文件可在MSDN library。
中找到我到目前为止的代码发布在下面。
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。
答案 0 :(得分:3)
对于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);
答案 1 :(得分:1)
这可能不是唯一的问题,但您需要将[Out]
属性添加到DLL导入声明中的pszProfilePath
参数。