gpt4 book ai didi

asp.net - .Net 2.0 ServiceController.GetServices()

转载 作者:行者123 更新时间:2023-12-02 16:27:33 24 4
gpt4 key购买 nike

我有一个启用了 Windows 身份验证的网站。从网站的页面中,用户可以启动一项对数据库执行某些操作的服务。

启动该服务对我来说效果很好,因为我是服务器上的本地管理员。但我刚刚让一个用户测试了它,但他们无法启动该服务。

我的问题是:

<小时/>

有人知道如何使用与当前登录帐户不同的 Windows 帐户按名称获取指定计算机上的服务列表吗?

<小时/>

我真的不想将所有需要启动服务的用户添加到一个Windows组中并将它们全部设置为我的IIS服务器上的本地管理员......

这是我得到的一些代码:

public static ServiceControllerStatus FindService()
{
ServiceControllerStatus status = ServiceControllerStatus.Stopped;

try
{
string machineName = ConfigurationManager.AppSettings["ServiceMachineName"];
ServiceController[] services = ServiceController.GetServices(machineName);
string serviceName = ConfigurationManager.AppSettings["ServiceName"].ToLower();

foreach (ServiceController service in services)
{
if (service.ServiceName.ToLower() == serviceName)
{
status = service.Status;
break;
}
}
}
catch(Exception ex)
{
status = ServiceControllerStatus.Stopped;
SaveError(ex, "Utilities - FindService()");
}

return status;
}

我的异常来自 try block 中的第二行。错误如下:

System.InvalidOperationException: Cannot open Service Control Manager on computer 'server.domain.com'. This operation might require other privileges. ---> System.ComponentModel.Win32Exception: Access is denied --- End of inner exception stack trace --- at System.ServiceProcess.ServiceController.GetDataBaseHandleWithAccess(String machineName, Int32 serviceControlManaqerAccess) at System.ServiceProcess.ServiceController.GetServicesOfType(String machineName, Int32 serviceType) at TelemarketingWebSite.Utilities.StartService()

感谢您的帮助/信息

最佳答案

注意:这并不涉及枚举不同用户的服务,但考虑到您正在做的事情的更广泛描述,我认为这是一个很好的答案。

我认为如果您直接访问感兴趣的服务,您可以大大简化这一过程,并可能避免部分安全问题。不要调用 GetServices,而是尝试以下操作:

string machineName = ConfigurationManager.AppSettings["ServiceMachineName"];
string serviceName = ConfigurationManager.AppSettings["ServiceName"];
ServiceController service = new ServiceController( serviceName, machineName );
return service.Status;

这直接连接到感兴趣的服务并绕过枚举/搜索步骤。因此,它不需要调用者具有 SC_MANAGER_ENUMERATE_SERVICE位于服务控制管理器 (SCM) 上,远程用户默认情况下没有该管理器。它仍然需要 SC_MANAGER_CONNECT ,但是according to MSDN应授予远程经过身份验证的用户。

找到感兴趣的服务后,您仍然需要能够停止和启动它,而您的远程用户可能无权这样做。但是,可以修改单个服务的安全描述符 (DACL),这将允许您授予远程用户停止和启动服务的访问权限,而无需他们是本地管理员。这是通过 SetNamedSecurityInfo 完成的API函数。您需要授予的访问权限是SERVICE_STARTSERVICE_STOP 。根据这些用户到底属于哪个组,您可能还需要授予他们 GENERIC_READ 。所有这些权利都是 described in MSDN .

这里是一些执行此设置的 C++ 代码,假设感兴趣的用户位于“远程服务 Controller ”组(您将创建的)中,并且服务名称为“my-service-name”。请注意,如果您想向众所周知的组(例如 Users)授予访问权限(不一定是个好主意)而不是您创建的组,则需要更改 TRUSTEE_IS_GROUPTRUSTEE_IS_WELL_KNOWN_GROUP .

该代码没有您想要添加的错误检查。所有三个可能失败的函数(Get/SetNamedSecurityInfo 和 SetEntriesInAcl)均返回 0 表示成功。

另一个注意事项:您还可以使用 the SC tool 设置服务的安全描述符。 ,可以在%WINDIR%\System32下找到,但不涉及任何编程。

#include "windows.h"
#include "accctrl.h"
#include "aclapi.h"

int main()
{
char serviceName[] = "my-service-name";
char userGroup[] = "Remote Service Controllers";

// retrieve the security info
PACL pDacl = NULL;
PSECURITY_DESCRIPTOR pDescriptor = NULL;
GetNamedSecurityInfo( serviceName, SE_SERVICE,
DACL_SECURITY_INFORMATION, NULL, NULL,
&pDacl, NULL, &pDescriptor );

// add an entry to allow the users to start and stop the service
EXPLICIT_ACCESS access;
ZeroMemory( &access, sizeof(access) );
access.grfAccessMode = GRANT_ACCESS;
access.grfAccessPermissions = SERVICE_START | SERVICE_STOP;
access.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
access.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
access.Trustee.ptstrName = userGroup;
PACL pNewDacl;
SetEntriesInAcl( 1, &access, pDacl, &pNewDacl );

// write the changes back to the service
SetNamedSecurityInfo( serviceName, SE_SERVICE,
DACL_SECURITY_INFORMATION, NULL, NULL,
pNewDacl, NULL );

LocalFree( pNewDacl );
LocalFree( pDescriptor );
}

这也可以使用 P/Invoke 在 C# 中完成,但这需要更多工作。

如果您仍然特别希望能够枚举这些用户的服务,则需要向他们授予 SC_MANAGER_ENUMERATE_SERVICE就在 SCM 上。不幸的是,according to MSDN ,SCM的安全性只能在Windows Server 2003 sp1或更高版本上修改。

关于asp.net - .Net 2.0 ServiceController.GetServices(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com