gpt4 book ai didi

mongodb - 如何使用 Powershell 创建 mongoDB 用户?

转载 作者:可可西里 更新时间:2023-11-01 09:54:06 26 4
gpt4 key购买 nike

我正在尝试编写一个脚本,在 mongoDB 3.0 副本集的 admin 数据库中创建一个用户。

经过大量阅读和使用不同版本的 c-sharp MongoDB 驱动程序的多次尝试,我终于能够将以下代码放在一起,它能够成功登录到副本集,访问 admin数据库,写出system集合的全名:

try {
Set-ExecutionPolicy Unrestricted
Add-Type -Path 'E:\drivers\MongoDB-CSharpDriver-2.0.2\MongoDB.Driver.dll'
Add-Type -Path 'E:\drivers\MongoDB-CSharpDriver-2.0.2\MongoDB.Driver.Core.dll'
Add-Type -Path 'E:\drivers\MongoDB-CSharpDriver-2.0.2\MongoDB.Bson.dll'

$connectionString = "mongodb://username:password@primary:27017,secondary:27017,arbiter:27017/admin?replicaSet=name&authSource=admin"
$dbName = "admin"
$collectionName = "System"

function Get-MongoDBDatabase ($connectionString, $db) {
$mongoClient = New-Object MongoDB.Driver.MongoClient($connectionString)
$mongoServer = $mongoClient.GetServer()
$mongoServer.GetDatabase($db)
}

[MongoDB.Driver.MongoDatabase] $mongoDatabase = Get-MongoDBDatabase $connectionString $dbName
[MongoDB.Driver.MongoCollection] $mongoCollection = $mongoDatabase.GetCollection($collectionName)

Write-Output "Test accessing collection: $($mongoCollection.FullName)"
}
catch {
Write-Output "Error: $($_.Exception.Message)"
}

在这一点上,我不知道该往哪个方向移动以在 admin 数据库中创建一个新用户并为该用户分配一些角色。

db.createUser( 
   {
     user: "testUser",
     pwd: "abc123",
     roles: [ 
        {role:"read", db:"admin"}, 
        {role:"readWrite", db:"databaseOne"},
        {role:"readWrite", db:"databaseTwo"},
        {role:"readWrite", db:"databaseThree"},
        {role:"readWrite", db:"databaseFour"},
        {role:"read", db:"config"}]
   }
)

以上是我希望能够在 admin 数据库上执行的命令/查询,但我需要您的帮助以了解如何使用 MongoDB C-Sharp 驱动程序将其转换为 Powershell v.2.0.2

最佳答案

好吧,我找到了一种方法来完成这项工作,可惜不完全在 Powershell 中。

根据@PeteGarafano 的建议,我决定在一个简单的 Visual Studio 类库中使用最新最好的驱动程序(版本 2.4.3.23,通过 NuGet 下载)。

由于目前这只是一个测试,代码非常粗糙并且充满了硬编码的东西(例如要分配给用户的角色)

类库代码如下:

using System;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;

namespace MongoDBUtilities
{
public class Connectivity
{
public bool DoesUserExist(string connectionString, string databaseName, string username)
{
try
{
var command = @" { usersInfo: { user: '" + username + @"', db: 'admin' } } ";

var result = runCommand(connectionString, databaseName, command);
var users = result["users"];
if(users != null)
{
var usersArray = users.AsBsonArray;
if(usersArray.Count > 0) {
return true;
}
}
return false;
}
catch (Exception ex)
{
return false;
}
}

public string CreateUser(string connectionString, string databaseName, string username, string password)
{
try
{
var command = @"{
createUser: '" + username + @"',
pwd: '" + password + @"',
roles: [
{ role: 'read', db: 'admin'}, 
{ role: 'read', db: 'someDB'}, 
      { role: 'read', db: 'someOtherDB'}]
}";

var result = runCommand(connectionString, databaseName, command);
return result.ToJson().ToString();
}
catch (Exception ex) {
return unfoldException(ex);
}
}

private BsonDocument runCommand(string connectionString, string databaseName, string command)
{
var database = getDatabase(connectionString, databaseName);
var task = database.RunCommandAsync<BsonDocument>(command);
var result = task.Result;
return result;
}

private IMongoDatabase getDatabase(string connectionString, string databaseName) {
IMongoClient client;
client = new MongoClient(connectionString);
return client.GetDatabase(databaseName);
}

private string unfoldException(Exception ex) {
string message = ex.Message + Environment.NewLine;
Exception currentException = ex;
while (currentException.InnerException != null)
{
currentException = currentException.InnerException;
message += currentException.Message + Environment.NewLine;
}
return message;
}
}
}

没什么特别的,真的,但重点是如何您可以使用任何命令的 JSON 形式,如 MongoDB 官方引用文档 中所述(例如:https://docs.mongodb.com/manual/reference/command/usersInfo/ ).

注意:还有另一种方法可以做到这一点,构建 BsonDocument 对象,但我发现它不太直观,因为引用使用所有 JSON 语法。

接下来,我在我的 PS 脚本中使用了这个库。这是一个例子:

try {
Set-ExecutionPolicy Unrestricted
Add-Type -Path 'E:\drivers\MongoDB\MongoDBUtilities.dll'

$connectionString = "mongodb://username:password@primaryServerName:27017,secondaryServerName:27017,arbiterServerName:27017/admin?replicaSet=replicaSetName&authSource=admin"
$conn = New-Object -TypeName MongoDBUtilities.Connectivity
if($conn.DoesUserExist($connectionString, "admin", "testUser")) {
Write-Output "User already exists, no need to create again"
}
else {
Write-Output "Creating user...";
$result = $conn.CreateUser($connectionString, "admin", "testUser", "test")
Write-Output $result;
}
}
catch {
Write-Output "Error: $($_.Exception.Message)"
}

此示例首先检查用户是否已在 admin 数据库中,如果不存在,则创建它。

我希望这对任何试图在 C# 或 Powershell 中做类似事情的人都有用。

关于mongodb - 如何使用 Powershell 创建 mongoDB 用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44417292/

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