我们的工作站不是SQL Server所在域的成员。(它们实际上根本不在域中-不要问)。
当我们使用SSMS或任何东西连接到SQL Server时,我们将RUNAS/NETONLY与DOMAIN\user一起使用。然后我们输入密码,它就会启动程序。(RUNAS/NETONLY不允许您在批处理文件中包含密码)。
所以我有一个.NET WinForms应用程序,它需要一个SQL连接,用户必须通过运行一个包含RUNAS/NETONLY命令行的批处理文件来启动它,然后启动EXE。
如果用户意外地直接启动EXE,则无法连接到SQL Server。
右键单击应用程序并使用“运行方式…”选项不起作用(大概是因为工作站并不真正了解该域)。
我正在寻找一种方法,让应用程序在启动任何重要功能之前在内部执行RUNAS/NETONLY功能。
请参阅此链接了解RUNAS/NETONLY的工作方式:http://www.eggheadcafe.com/conversation.aspx?messageid=32443204&threadid=32442982
我想我必须用LOGON_NETCREDENTIALS_ONLY
和CreateProcessWithLogonW
7条答案
按热度按时间jm2pwxwz1#
我知道这是一个旧线程,但它非常有用。我和Cade Roux的情况完全一样,因为我想要/网络风格的功能。
John Rasch的答案只需稍作修改就可以了
添加以下常量(为一致性,请围绕第102行):
然后将调用更改为
LogonUser
,以使用LOGON32_LOGON_NEW_CREDENTIALS
而不是LOGON32_LOGON_INTERACTIVE
。这是我唯一需要做的改变,让它完美运行!!!谢谢约翰和凯德!!!
以下是为便于复制/粘贴而修改的完整代码:
vmdwslir2#
我刚刚用
ImpersonationContext
做了类似的事情。它使用起来非常直观,对我来说非常有效。要以其他用户身份运行,语法为:
课程内容如下:
ffvjumwh3#
我收集了这些有用的链接:
http://www.developmentnow.com/g/36_2006_3_0_0_725350/Need-help-with-impersonation-please-.htm升
http://blrchen.spaces.live.com/blog/cns!572204F8C4F8A77A!251.entry
i1 j2 k1 l
http://msmvps.com/blogs/martinzugec/archive/2008/06/03/use-runas-from-non-domain-computer.aspx
事实证明,我将不得不使用
LOGON_NETCREDENTIALS_ONLY
和CreateProcessWithLogonW
。我将看看是否可以让程序检测到它是否以这种方式启动,如果没有,则收集域凭据并自行启动。这样,只有一个自我管理的EXE。ycl3bljg4#
此代码是RunAs类的一部分,我们使用该类启动具有提升权限的外部进程。为用户名和密码传递null将提示标准UAC警告。当传递用户名和密码的值时,您实际上可以在没有UAC提示的情况下启动提升的应用程序。
7xllpg7q5#
使用这里非常有用的答案,我创建了下面的简化类,它使用了.NET标准中提供的API:
以下是您使用它的方式:
qyswt5oh6#
我想你不能只为应用程序添加一个用户到sqlserver,然后使用sql身份验证而不是windows身份验证吗?
eiee3dmh7#
对于.NET Core,
WindowsImpersonationContext
和WindowsIdentity.Impersonate()
不可用。这里有一个链接,指向.NETCore的类似解决方案。WindowsImpersonationContext & Impersonate() not found in ASP.Core升