ниже - помощник, которого я использую. Он работает с обычными доменными пользователями. Для GMSA нет пароля для предоставления, и Logonuser возвращает ошибку (код WIN32). Можно ли выдать себя за программно выдать себя за GMSA для этого варианта использования, и если да, то как (LogonType, приобретение токена, без пароля и т. Д.)? Или правильный подход к запуску процесса/службы в рамках идентификации GMSA и тестирования оттуда вместо логика?
Код: Выделить всё
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
namespace CloudInstaller.Account
{
internal class ImpersonationHelper : IImpersonationHelper
{
private readonly ICloudLogger _logger;
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);
private const int LOGON32_LOGON_INTERACTIVE = 2;
private const int LOGON32_PROVIDER_DEFAULT = 0;
private const int LOGON32_LOGON_SERVICE = 5;
public ImpersonationHelper(ICloudLogger logger)
{
_logger = logger;
}
public void RunAsUser(AccountInfo accountInfo, Action action)
{
ValidateAccountInfo(accountInfo);
if (IsCurrentUser(accountInfo.UserName!))
{
action();
return;
}
IntPtr userToken = IntPtr.Zero;
try
{
bool success = LogonUser(accountInfo.Name, accountInfo.Domain, accountInfo.Password ?? string.Empty, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out userToken);
if (success == false)
{
int error = Marshal.GetLastWin32Error();
_logger.Debug("LogonUser failed with error code: {error}", error);
throw new UnauthorizedAccessException(string.Format(InstallerStrings.ImpersonationHelper_LogonFailed, accountInfo.Name, accountInfo.Domain, error));
}
using WindowsIdentity identity = new(userToken);
WindowsIdentity.RunImpersonated(identity.AccessToken, action);
}
finally
{
if (userToken != IntPtr.Zero)
{
CloseHandle(userToken);
}
}
}
...
}
}
< /code>
для учетной записи этой ошибки с: < /p>
System.UnauthorizedAccessException: Failed to logon user 'msaadam$' in domain 'SAL-TRAINING'. Error code: 1326
at CloudInstaller.Account.ImpersonationHelper.RunAsUser(AccountInfo accountInfo, Action action)
at CloudInstaller.Services.WriteAccessValidatorService.VerifyWriteAccessToDirectories(IEnumerable`1 directories, AccountInfo accountInfo)
Подробнее здесь: https://stackoverflow.com/questions/797 ... owsidentit
Мобильная версия