如何使用远程PowerShell创建本地Windows用户帐户?

3

我尝试使用PowerShell创建用户。在本地计算机上运行良好。但是如何使用远程PowerShell在远程计算机上创建本地用户帐户?

脚本localwindows.ps1内容如下:

$comp = [adsi]'WinNT://machinename,computer';
$user = $comp.Create('User', 'account4');
$user.SetPassword('change,password.10');
$user.SetInfo();

我尝试通过C#做同样的事情:

            PSCredential credential = new PSCredential(userName, securePassword);
            WSManConnectionInfo connectionInfo = new WSManConnectionInfo(false, "machinename", 5985, "/wsman", shellUri, credential);
            using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
            {

                runspace.Open();
                 String file = "C:\\localwindows.ps1";
                 Pipeline pipeline = runspace.CreatePipeline();
                 pipeline.Commands.AddScript(System.IO.File.ReadAllText(file));                    
                 pipeline.Commands.Add("Out-String");

                 // execute the script 
                 Collection<PSObject> results = pipeline.Invoke();
              }  

这在本地运行时是可以正常工作的。但是在远程计算机上,它会抛出“创建:拒绝访问”的异常。


你能否将你的PowerShell脚本添加到这个案例中? - Chelseawillrecover
我已经使用PowerShell脚本编辑了内容。 - cmm user
http://gallery.technet.microsoft.com/scriptcenter/Add-new-local-administrator-3a962c5e - JohnLBevan
6个回答

2
我使用以下命令在远程计算机上创建了一个本地用户帐户:
Invoke-Command -ComputerName machineName -filepath c:\script.ps1 -credential  $getcredential

这个脚本是什么意思?

$comp = [adsi]'WinNT://localhost,computer';
$user = $comp.Create('User', 'account11');
$user.SetPassword('change,password.10');
$user.SetInfo();
$user

0

我不知道这个问题是否仍然相关,但我已经尝试过并找到了需要修复的内容。当您创建目录条目对象时,请使用以下代码

$objOu = New-Object System.DirectoryServices.DirectoryEntry("WinNT://$computer", $admin, $adminPass, "Secure")

其余部分相同。


0

使用ADSI WinNT提供程序

$username = "foo"
$password = "bar"
$computer = "hostname"

$prov = [adsi]"WinNT://$computer"
$user = $prov.Create("User", $username)
$user.SetPassword($password)
$user.SetInfo()

我使用了以上方法连接到本地主机。但是在尝试在远程机器上创建时,它会抛出异常:'Exception calling "setinfo" with "0" argument(s): "Access is denied." 在第1行第12个字符处:$HD.setinfo <<<< () + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: CatchFromBaseAdapterMethodInvokeTI - cmm user
确保您的帐户已经被授权远程访问这台主机,远程管理已启用 (winrm qc) 并且远程主机的Windows防火墙允许访问。 - Ansgar Wiechers
如何传递具有远程主机权限的帐户的凭据? - cmm user
请尝试使用 New-Object System.DirectoryServices.DirectoryEntry("WinNT://$computer", $adminuser, $adminpass) 替换 [adsi]"WinNT://$computer" - Ansgar Wiechers

0

PowerShell脚本invoke-Command可在远程计算机上执行任何PowerShell脚本。您没有说明如何使用PowerShell创建用户,但是作为示例,您可以编写:

invoke-command -computername myserver {[ADSI]$server="WinNT://localhost";$HD=$server.Create("User","HD");$HD.SetPassword("H3lpD3>K");$HD.SetInfo()}

你也可以使用 -filepath 参数远程执行本地的 PowerShell 脚本:

Invoke-Command -ComputerName MyRemoteServer -filepath c:\Scripts\DaScript.ps1

为了启用远程命令,您将需要在远程计算机上启用winrm。您可以通过运行以下命令来完成此操作:

winrm quickconfig

在远程计算机上。


我尝试以下方式[ADSI]$server="WinNT://localhost"$HelpDesk=$server.Create("User","HelpDesk")$HelpDesk.SetPassword("H3lpD3>K")$HelpDesk.SetInfo() - cmm user
我尝试了以下方式:[ADSI]$server="WinNT://localhost"$HelpDesk=$server.Create("User","HelpDesk")$HelpDesk.SetPassword("H3lpD3>K")$HelpDesk.SetInfo()但是在给出以下内容时,我遇到了错误:[ADSI]$server="WinNT://$servername" $HD=$server.Create("User","HD")$HD.SetPassword("H3lpD3>K")$HD.SetInfo() - cmm user
我遇到了错误:“'Exception calling "setinfo" with "0" argument(s): "Access is denied.",在第1行第12个字符处:+ $HD.setinfo <<<< () + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: CatchFromBaseAdapterMethodInvokeTI'"这里的servername是要连接的远程计算机的名称。 - cmm user
我已经使用你的代码更新了我的答案,并在我的网络上测试通过。看起来你有一些访问问题。确保你以管理员身份运行你的Powershell窗口,并且你已经在远程服务器上运行了winrm quickconfig。 - Snorre
本地主机对我来说运行良好。我已经以管理员身份启动了powershell。我还在远程计算机上运行了“winrm quickconfig”。但我得到了错误“使用“0”个参数调用“SetInfo”时出现异常:未指定的错误 ” 在第1行字符12处:
  • $HD.SetInfo <<<< ()
    • CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    • FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
- cmm user
很抱歉,我对此没有解决方案。只需确保您创建的用户具有唯一名称,并且不要替换我的示例中的“localhost”,只替换“myserver”的值即可。 - Snorre

0
如果您有一个PowerShell脚本来在服务器本地创建本地用户帐户,那么只需使用PSExec以管理员身份在远程计算机上运行它即可。

我尝试使用以下命令在远程计算机上执行脚本 - C:\localwindows.ps1 PSexec.exe \%comp% -c -f -u Domain\username %ScriptPath%但是我仍然收到错误提示调用 "SetInfo" 时发生异常,参数为 "0": "拒绝访问。" 在 C:\localwindows.ps1 的第4行字符14处:
  • $user.SetInfo <<<< ();
    • CategoryInfo : NotSpecified: (:) [], MethodInvocationException
    • FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
- cmm user
好的,我上班后会查看这个问题。同时,请尝试检查远程机器上的Windows日志,看是否有任何记录。还请确认使用的域帐户是否是目标机器上域管理员组和本地管理员组的成员。 - Chelseawillrecover
我使用的帐户是域上的用户(本地管理员角色)。我尝试使用Computer\Administrator在远程计算机上创建帐户,但也抛出了异常:“拒绝访问”。 - cmm user
好的,我在这里忘记提到了,当你尝试运行psexec时,请以管理员身份打开命令提示符,并在两台计算机上禁用UAC。有时候UAC可能会很烦人……你可以为此创建一个聊天,这样帖子就不会太长了。另外,你在尝试哪个操作系统? - Chelseawillrecover
我尝试在一台Windows 7机器上创建本地账户,该机器与另一台Windows 7机器相连。但是,本地机器中的用户在远程Windows 7机器上没有管理员角色。我尝试从Windows 7到Windows 2008 R2创建本地用户账户,由于Windows 7中的用户在远程机器上具有特权,因此它可以正常工作。 - cmm user
显示剩余3条评论

0

Invoke-Command 可以工作,但您也可以使用 Enter-PSSession -Computer 在远程计算机上本地提交命令。 以下内容将提示用户输入用户名,并将其添加到本地管理员组中,无需密码:

$user = read-host 'What is the name of the local user you would like to add?'
net user /add $user
net localgroup Administrators /add $user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接