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

时间:2011-04-28 04:12:42

标签: c# winapi pinvoke

快速提问(希望如此),如何从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。

2 个答案:

答案 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参数。