ApplicationPoolIdentity下的C#远程PowerShell会话
使用我从Microsoft找到的一个,我一直在尝试(使用C#)为我的用户提供电子邮件帐户Live@Edu库使用远程PowerShell会话来完成此任务。我已经用模拟本地管理员帐户的ApplicationPoolIdentity下的C#远程PowerShell会话,c#,powershell-remoting,C#,Powershell Remoting,使用我从Microsoft找到的一个,我一直在尝试(使用C#)为我的用户提供电子邮件帐户Live@Edu库使用远程PowerShell会话来完成此任务。我已经用模拟本地管理员帐户的using(){}块包装了PowerShell调用。当我在自己的开发机器上运行代码时,它工作得很好,并为帐户提供了资源Live@Edu,但是,当我在生产服务器上运行相同的代码时,我从PowerShell获得一个访问被拒绝错误 我刚才注意到的是,如果我将服务器上的IIS应用程序池用户更改为我自己的域帐户,则在生产服务器上
using(){}
块包装了PowerShell调用。当我在自己的开发机器上运行代码时,它工作得很好,并为帐户提供了资源Live@Edu,但是,当我在生产服务器上运行相同的代码时,我从PowerShell获得一个访问被拒绝
错误
我刚才注意到的是,如果我将服务器上的IIS应用程序池用户更改为我自己的域帐户,则在生产服务器上一切正常,但将其保留为ApplicationPoolIdentity
则不起作用。因此,似乎即使在我的代码中我模拟了本地管理员,这些凭据也没有传递到PowerShell会话。奇怪的是,当脚本在我自己的机器上运行时,也在ApplicationPoolIdentity
下运行时,没有问题,这让我相信脚本实际上是在我自己的帐户下运行的(我是本地管理员)
我确实让代码吐出了$env:username
的值,它给了我机器名,我希望它给我它运行时的实际用户名,因为这是我直接在PowerShell窗口中键入该命令时得到的
当使用我在代码中模拟的凭据以交互方式登录到远程服务器时,我可以在PowerShell窗口中手动键入所有PowerShell CMDL,它们工作正常
我不想让我的IIS应用程序池总是在管理员帐户下运行,因为这看起来很愚蠢。那么,有没有一种方法可以以管理员身份运行PowerShell脚本,而不是我正在进行的当前模拟
更新:
发生了一件奇怪的事情,我认为这是一个解决办法。将代码部署到服务器后,我创建了一个本地管理员帐户。然后我转到IIS应用程序池,将所有者从
ApplicationPoolIdentity
更改为我刚刚创建的管理员帐户。在此之后,页面将可以正常运行PowerShell脚本。我以前就知道这一点,但不想让IIS使用管理员帐户。然后,我继续将应用程序池设置回ApplicationPoolIdentity
,并删除了本地管理员帐户,页面仍然可以使用!?我重新启动了IIS和Web服务器本身,一切正常。我所能想到的是,将应用程序池移动到管理员帐户会永久性地更改应用程序池中的某些属性。现在,我在服务器上将我的应用程序的IIS应用程序池中的加载用户配置文件
选项设置为False
(False
是Windows server 2008的默认设置),这与问题有关。在阅读了这个属性之后,我不完全确定这对我的场景有什么影响,但这是我本地机器上IIS中与Web服务器设置不同的设置。现在,所有PowerShell调用都在服务器上完美地工作。您是如何进行模拟的?使用LogonUser?是的,我正在使用LogonUser,我正在使用交互模式。这是一个长期的尝试,但是LogonUser成功了吗?很容易忘记检查返回值,其他一切似乎都会正常工作。我在系统的其他地方使用了相同的模拟代码,使用一个围绕LogonUser的函数就可以了,所以应该会成功,是的。