Могу ли я выдать себя за GMSA (учетную запись управляемой службы) с помощью LogonUser/WindowsIdentity, чтобы тестироватьC#

Место общения программистов C#
Ответить
Anonymous
 Могу ли я выдать себя за GMSA (учетную запись управляемой службы) с помощью LogonUser/WindowsIdentity, чтобы тестировать

Сообщение Anonymous »

Я строю установщик Windows (wpf, .net 8), который необходимо проверить выбравшую учетную запись (либо пользователь домена, либо GMSA), может написать в несколько каталогов перед установкой. Самый простой способ, который я обнаружил, - выдать себя за учетную запись и попытаться написать временный файл.
ниже - помощник, которого я использую. Он работает с обычными доменными пользователями. Для 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)
Существует ли поддерживаемый способ выдать себя за программную поддачу GMSA (LogonUser/Runempersonated) без пароля для тестирования доступа к записи?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... owsidentit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»