in LinuxCommunicator/Credentials.cs [437:501]
internal static void AddLocalAccount(string username, SecureString password, bool isAdmin, bool schedulerOnAzure)
{
CredentialNativeMethods.USER_INFO_1 info = new CredentialNativeMethods.USER_INFO_1();
info.sUsername = username;
if (password == null)
{
info.sPassword = Marshal.StringToCoTaskMemUni(String.Empty);
}
else
{
info.sPassword = Marshal.SecureStringToCoTaskMemUnicode(password);
}
info.uiPriv = CredentialNativeMethods.USER_PRIV_USER;
info.sHome_Dir = null;
info.sComment = null;
info.sScript_Path = null;
info.uiFlags = CredentialNativeMethods.UF_SCRIPT;
// Check the string length to prevent memory overflow
if (info.sUsername.Length > 128)
{
throw new ArgumentException("The user name is too long.");
}
if (password != null && password.Length > 512)
{
throw new ArgumentException("The password is too long.");
}
try
{
uint errParam = 0;
int errCode = CredentialNativeMethods.NetUserAdd(null, 1, ref info, out errParam);
if (errCode != CredentialNativeMethods.NERR_Success)
{
switch (errCode)
{
case CredentialNativeMethods.NERR_UserExists:
throw new ArgumentException("The local user " + username + " already exists.");
case CredentialNativeMethods.NERR_PasswordTooShort:
throw new ArgumentException("The password given is too short.");
default:
throw new Exception("Error when trying to create local account " + username + " exists. Error code: " + errCode + ", sub-error: " + errParam);
}
}
}
finally
{
if (info.sPassword != IntPtr.Zero)
{
try
{
Marshal.ZeroFreeCoTaskMemUnicode(info.sPassword);
}
catch { }
}
}
AddUserGroups(username, isAdmin, schedulerOnAzure);
}