Вызов win32 CreateProfile () из управляемого кода C # - PullRequest
3 голосов
/ 28 апреля 2011

Быстрый вопрос (надеюсь), как правильно вызвать функцию 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 .Любая полезная информация по этому вопросу приветствуется.

Спасибо,-Sean

Обновление: Решено!строковый буфер для pszProfilePath не может иметь длину больше 260.

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Для параметра 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 голос
/ 28 апреля 2011

Возможно, это не единственная проблема, но вам нужно добавить атрибут [Out] к параметру pszProfilePath в объявлении импорта DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...