使用我从Microsoft找到的Library,我一直在尝试(使用C#)使用Live @ Edu为我的用户配置电子邮件帐户,并且该库使用远程PowerShell会话来执行此操作。我已使用模拟本地管理员帐户的using() { }
块封装了PowerShell调用。当我在自己的开发机器上运行代码时,它运行良好并在Live @ Edu上设置帐户,但是当我在生产服务器上运行相同的代码时,我从PowerShell收到Access is Denied
错误。
我刚刚注意到的是,如果我将服务器上的IIS应用程序池用户更改为我自己的域帐户,一切在生产服务器上运行正常,但将其保留为ApplicationPoolIdentity
不起作用。因此,即使在我的代码中我冒充本地管理员,这些凭据也不会传递给PowerShell会话。奇怪的是,当脚本在我自己的机器上运行时,也在ApplicationPoolIdentity
下,没有问题,这让我相信脚本实际上是在我自己的机器上运行的(我是本地管理员) )。
我确实让代码吐出了$env:username
的值,它给了我机器名称,我希望它能给我实际运行的用户名,因为这是我输入的命令直接进入PowerShell窗口。
使用我在代码中模拟的凭据以交互方式登录到远程服务器时,我可以手动将所有PowerShell cmdlts键入PowerShell窗口,它们可以正常工作。
我不希望我的IIS应用程序池总是在管理员帐户下运行,因为这看起来很愚蠢,所以有没有办法以管理员的身份运行PowerShell脚本比我正在进行的模拟更进一步?< / p>
更新
发生了一件奇怪的事情,它看起来像是我的解决方案。将我的代码部署到我创建的服务器后,我添加了一个本地管理员帐户。然后我转到IIS应用程序池并将所有者从ApplicationPoolIdentity
更改为我刚创建的管理员帐户。之后,该页面可以正常运行PowerShell脚本。我之前已经知道这一点,但不希望IIS使用管理员帐户。然后我继续将应用程序池设置回ApplicationPoolIdentity
并删除了本地管理员帐户,页面仍然有用!?我重新启动了IIS和Web服务器本身,一切正常。我能想到的是,将应用程序池移动到管理员帐户会永久更改应用程序池中的某些属性。我现在放了modified question on ServerFault。
答案 0 :(得分:5)
原来问题与IIS应用程序池中的Load User Profile
选项有关,我的应用程序在服务器上设置为False
(False
是Windows Server 2008的默认设置)。在阅读了这个属性之后,我不完全确定为什么这对我的场景很重要,但这是我在本地机器上的IIS与Web服务器的不同之处。现在,所有PowerShell调用都可以在服务器上完美运行。