Этот вопрос связан с запуском процессов с определенными учетными данными из службы Windows., но это другая проблема.
Я запустил процесс из службы Windows в системном сеансе (0) с определенными учетными данными, но он не может прослушивать URL-адрес общего доступа к порту. Он использует учетную запись домена «Рабочий» на компьютере с Windows Server 2008.
Мой файл SMSvcHost.exe.config: http://pastie.org/private/jxed8bdft0eir5uc371pq
Я также перезапустил службы и машину, но это все еще дает мне это исключение:
System.ServiceModel.CommunicationException: The service endpoint failed to listen on the URI 'net.tcp://localhost:5400/Agent/384' because access was denied. Verify that the current user is granted access in the appropriate allowAccounts section of SMSvcHost.exe.config. ---> System.ComponentModel.Win32Exception: Access is denied
at System.ServiceModel.Activation.SharedMemory.Read(String name, String& content)
at System.ServiceModel.Channels.SharedConnectionListener.SharedListenerProxy.ReadEndpoint(String sharedMemoryName, String& listenerEndpoint)
Мой код ProcessHelper, запускающий процесс: http://pastie.org/private/iytqehsdfujrgil1decda а>. Я вызываю метод StartAsUserFromService
.
Я предполагаю, что связь между SID в конфиге и учетной записью, под которой запущен процесс, как-то не делается. Но почему?
РЕДАКТИРОВАТЬ:
Я дважды проверил, что конфигурация, которую я редактирую, используется службой. Я пытался явно добавить системную учетную запись и всех, но это все еще дает мне ошибку отказа в доступе. Как будто он вообще не смотрит на этот конфиг.
Как я могу найти, где находится отсутствующее разрешение?
РЕДАКТИРОВАТЬ:
Я переустановил .NET 4.5.1 на машину и все обновления Windows, но все равно не повезло.
РЕДАКТИРОВАТЬ:
Является ли это правильным способом дублирования токена пользователя, чтобы он мог использовать совместное использование портов? В частности, бит SecurityDescriptor
?
private static ImpersonationResult ImpersonateUser(string domain, string username, string password)
{
IntPtr token = IntPtr.Zero;
IntPtr primaryToken = IntPtr.Zero;
try
{
// Get token
bool bImpersonated = LogonUser(
username,
domain,
password,
(int)LogonType.NetworkClearText,
(int)LogonProvider.Default,
ref token);
if (!bImpersonated)
{
throw new Exception(string.Format("Failed to impersonate identity. Error code: {0}", Marshal.GetLastWin32Error()));
}
SecurityDescriptor sd = new SecurityDescriptor();
IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(sd));
Marshal.StructureToPtr(sd, ptr, false);
InitializeSecurityDescriptor(ptr, 1);
sd = (SecurityDescriptor)Marshal.PtrToStructure(ptr, typeof(SecurityDescriptor));
// Set up security
bool bDecriptorSet = SetSecurityDescriptorDacl(
ref sd,
true,
IntPtr.Zero,
false);
if (!bDecriptorSet)
{
throw new Exception(string.Format("Failed to set security descriptor. Error code: {0}", Marshal.GetLastWin32Error()));
}
SecurityAttributes processAttributes = new SecurityAttributes();
processAttributes.lpSecurityDescriptor = ptr;
processAttributes.nLength = (uint)Marshal.SizeOf(sd);
processAttributes.bInheritHandle = true;
// Duplicate token
bool bTokenDuplicated = DuplicateTokenEx(
token,
0,
ref processAttributes,
(int)SecurityImpersonationLevel.SecurityImpersonation,
(int)TokenType.TokenPrimary,
ref primaryToken);
if (!bTokenDuplicated)
{
throw new Exception(string.Format("Failed to duplicate identity token. Error code: {0}", Marshal.GetLastWin32Error()));
}
SecurityAttributes threadAttributes = new SecurityAttributes();
threadAttributes.lpSecurityDescriptor = IntPtr.Zero;
threadAttributes.nLength = 0;
threadAttributes.bInheritHandle = false;
// Got the token
return new ImpersonationResult()
{
Token = primaryToken,
ProcessAttributes = processAttributes,
ThreadAttributes = threadAttributes
};
}
finally
{
FreeToken(token);
}
}
private static void FreeToken(IntPtr token)
{
if (token != IntPtr.Zero)
{
CloseHandle(token);
}
}
РЕДАКТИРОВАТЬ:
Вот часть app.config моего процесса, который включает совместное использование портов: /а>
Вот часть app.config службы, которая запускает процесс: /а>. У него нет проблем с использованием общего доступа к порту, потому что он работает под системной учетной записью.
Сама служба общего доступа к портам включена, и я уже упоминал, что несколько раз перезагружал машину.
Роль «Сервер приложений» не установлена, но когда я добавляю ее, роль общего доступа к портам TCP уже отмечена и неактивна, поэтому ее должно было установить что-то еще. Он поставляется с .NET 4.5.1?
<system.serviceModel.activation>
, который ЗАКОММЕНТИРОВАН. отредактировав его в блокноте, вы можете это пропустить. обязательно найдите<!--
и-->
в этом файле. - person Menahem   schedule 18.02.2014localhost
, а к имени машины? - person Menahem   schedule 18.02.2014