快速问题(希望),如何从C#(托管代码)正确调用win32函数CreateProfile()?我试图自己设计一个解决方案,但没有成功。从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
错误codfe 0x800706f7的含义:存根收到坏数据。不知道这是否有帮助。 – PVitt 2011-04-28 12:26:23
@PVitt,这是很好的知道,但我不知道我输入错误。 – Sean 2011-04-28 12:29:08
您不需要任何MarshalAs属性,因为您只是重复默认设置。 – 2011-04-28 14:28:37