Author: ekohl
Date: Fri Jun 14 22:31:38 2013
New Revision: 59215
URL:
http://svn.reactos.org/svn/reactos?rev=59215&view=rev
Log:
[NETAPI32]
- Implement NetUserSetInfo (levels 0, 1 and 3 only).
- Add level 0 support to SetUserInfo.
Modified:
trunk/reactos/dll/win32/netapi32/user.c
Modified: trunk/reactos/dll/win32/netapi32/user.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netapi32/user.c?…
==============================================================================
--- trunk/reactos/dll/win32/netapi32/user.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netapi32/user.c [iso-8859-1] Fri Jun 14 22:31:38 2013
@@ -23,7 +23,6 @@
* Implement NetUserChangePassword
* Implement NetUserGetGroups
* Implement NetUserSetGroups
- * Implement NetUserSetInfo
* NetUserGetLocalGroups does not support LG_INCLUDE_INDIRECT yet.
* Add missing information levels.
* ...
@@ -764,6 +763,7 @@
DWORD Level)
{
USER_ALL_INFORMATION UserAllInfo;
+ PUSER_INFO_0 UserInfo0;
PUSER_INFO_1 UserInfo1;
PUSER_INFO_3 UserInfo3;
NET_API_STATUS ApiStatus = NERR_Success;
@@ -773,8 +773,18 @@
switch (Level)
{
+ case 0:
+ UserInfo0 = (PUSER_INFO_0)UserInfo;
+
+ RtlInitUnicodeString(&UserAllInfo.UserName,
+ UserInfo0->usri0_name);
+
+ UserAllInfo.WhichFields = USER_ALL_USERNAME;
+ break;
+
case 1:
UserInfo1 = (PUSER_INFO_1)UserInfo;
+
// RtlInitUnicodeString(&UserAllInfo.UserName,
// UserInfo1->usri1_name);
@@ -960,8 +970,17 @@
TRACE("(%s, %d, %p, %p)\n", debugstr_w(servername), level, bufptr,
parm_err);
/* Check the info level */
- if (level < 1 || level > 4)
- return ERROR_INVALID_LEVEL;
+ switch (level)
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ break;
+
+ default:
+ return ERROR_INVALID_LEVEL;
+ }
if (servername != NULL)
RtlInitUnicodeString(&ServerName, servername);
@@ -1199,7 +1218,7 @@
NET_API_STATUS ApiStatus = NERR_Success;
NTSTATUS Status = STATUS_SUCCESS;
- FIXME("(%s %d 0x%d %p %d %p %p %p) stub!\n", debugstr_w(servername),
level,
+ TRACE("(%s %d 0x%d %p %d %p %p %p)\n", debugstr_w(servername), level,
filter, bufptr, prefmaxlen, entriesread, totalentries, resume_handle);
*entriesread = 0;
@@ -1900,9 +1919,109 @@
LPBYTE buf,
LPDWORD parm_err)
{
- FIXME("(%s %s %lu %p %p)\n",
+ UNICODE_STRING ServerName;
+ UNICODE_STRING UserName;
+ SAM_HANDLE ServerHandle = NULL;
+ SAM_HANDLE AccountDomainHandle = NULL;
+ SAM_HANDLE UserHandle = NULL;
+ NET_API_STATUS ApiStatus = NERR_Success;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ TRACE("(%s %s %lu %p %p)\n",
debugstr_w(servername), debugstr_w(username), level, buf, parm_err);
- return ERROR_ACCESS_DENIED;
+
+ /* Check the info level */
+ switch (level)
+ {
+ case 0:
+ case 1:
+// case 2:
+ case 3:
+// case 4:
+// case 21:
+// case 22:
+// case 1003:
+// case 1005:
+// case 1006:
+// case 1007:
+// case 1008:
+// case 1009:
+// case 1010:
+// case 1011:
+// case 1012:
+// case 1014:
+// case 1017:
+// case 1020:
+// case 1024:
+// case 1051:
+// case 1052:
+// case 1053:
+ break;
+
+ default:
+ return ERROR_INVALID_LEVEL;
+ }
+
+ if (servername != NULL)
+ RtlInitUnicodeString(&ServerName, servername);
+
+ RtlInitUnicodeString(&UserName, username);
+
+ /* Connect to the SAM Server */
+ Status = SamConnect((servername != NULL) ? &ServerName : NULL,
+ &ServerHandle,
+ SAM_SERVER_CONNECT | SAM_SERVER_LOOKUP_DOMAIN,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamConnect failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Open the Account Domain */
+ Status = OpenAccountDomain(ServerHandle,
+ (servername != NULL) ? &ServerName : NULL,
+ DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
+ &AccountDomainHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
+ ApiStatus = NetpNtStatusToApiStatus(Status);
+ goto done;
+ }
+
+ /* Open the User Account */
+ ApiStatus = OpenUserByName(AccountDomainHandle,
+ &UserName,
+ USER_ALL_ACCESS,
+ &UserHandle);
+ if (ApiStatus != NERR_Success)
+ {
+ ERR("OpenUserByName failed (ApiStatus %lu)\n", ApiStatus);
+ goto done;
+ }
+
+ /* Set user information */
+ ApiStatus = SetUserInfo(UserHandle,
+ buf,
+ level);
+ if (ApiStatus != NERR_Success)
+ {
+ ERR("SetUserInfo failed (Status %lu)\n", ApiStatus);
+ }
+
+done:
+ if (UserHandle != NULL)
+ SamCloseHandle(UserHandle);
+
+ if (AccountDomainHandle != NULL)
+ SamCloseHandle(AccountDomainHandle);
+
+ if (ServerHandle != NULL)
+ SamCloseHandle(ServerHandle);
+
+ return ApiStatus;
}
/* EOF */