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

本文关键字:CreateProfile win32 调用 托管代码 | 更新日期: 2023-09-27 17:53:16

快速问题(希望),我如何正确调用win32函数CreateProfile()从c#(托管代码)?我曾试图自己想出一个解决办法,但无济于事。

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。我们非常欢迎有关此事的任何有用信息。

谢谢,
肖恩


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

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

对于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);

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