Невозможно получить ВСЕ группы, возможно только получить группы, которыми вы управляете, с помощью разрешения user_managed_groups
и конечной точки /me/groups
.
Это похоже на использование new Process()
с именем пользователя и паролем, а сервисный режим «не вычисляет»:)
Цитата из MSDN:
Вы можете изменить параметры, указанные в свойстве StartInfo, до времени, когда вы вызываете метод Start в процессе. После запуска процесса изменение значений StartInfo не влияет и не перезапускает связанный процесс. Если вы вызываете метод Start (ProcessStartInfo) с установленными свойствами ProcessStartInfo .. ::. UserName и ProcessStartInfo .. ::. Password, вызывается неуправляемая функция CreateProcessWithLogonW, которая запускает процесс в новом окне, даже если значение свойства CreateNoWindow Значение true или значение свойства WindowStyle скрыто.
Кроме того, смотрите документацию CreateProcessWithLogonW:
lpStartupInfo [in]
Указатель на структуру STARTUPINFO. Приложение должно добавить разрешение для указанной учетной записи пользователя для указанной оконной станции и рабочего стола, даже для WinSta0 \ Default.
Если элемент lpDesktop имеет значение NULL или пустую строку, новый процесс наследует рабочий стол и оконную станцию своего родительского процесса. Приложение должно добавить разрешение для указанной учетной записи пользователя на унаследованную оконную станцию и рабочий стол.
В .NET StartupInfo нет lpDesktop, с другой стороны, у пользователя SERVICE нет рабочего стола, что может привести к вашей проблеме.
Короче говоря, попробуйте установить LoadUserProfile
в true
, чтобы загрузить информацию о пользователе из реестра, или, возможно, вам нужно установить рабочий каталог и т. Д.
Для дальнейшего расследования вам следует проверить свою среду и, возможно, записать, какие файлы доступны с помощью FileMon.
Я бы попытался создать процесс в олицетворенном контексте вновь созданного пользователя, как показано ниже.
[DllImport("advapi32.DLL", SetLastError = true)]
public static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);
[DllImport("advapi32.DLL")]
public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);
static void Main()
{
IntPtr admin_token = new IntPtr();
WindowsIdentity wid_admin = null;
WindowsImpersonationContext wic = null;
LogonUser("username", "domain", "password", 9, 3, out admin_token);
wid_admin = new WindowsIdentity(admin_token);
wic = wid_admin.Impersonate();
_process = new Process
{
StartInfo =
{
Arguments = " -debug",
FileName = instanceDirectory + "host.exe",
WorkingDirectory = instanceDirectory,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
UserName = Helpers.GetUserNameForInstance(_hostid),
Password = _hostpass,
Domain = ""
},
EnableRaisingEvents = true
};
if (wic != null) wic.Undo();
CloseHandle(admin_token);
}
Двойной прыжок между серверами может привести к потере учетных данных службы, возможно, настройка Kerberos решит эту проблему.
0xC0000142
(-1073741502) - status_dll_init_failed:
Инициализация динамической библиотеки связи [Имя] не удалось. Процесс прекращается ненормально.
Как указал на сайте TENAURYIMPY, вам нужно дать разрешения на учетную запись к окно станции и рабочего стола. Но если программа интерактивна, вам необходимо установить идентификатор сеанса токена процесса.