2017-06-07 7 views
3

mongoDB 3.0レプリカセットのadminデータベースにユーザーを作成するスクリプトを作成しようとしています。Powershellを使用してmongoDBユーザーを作成するには?

さまざまなバージョンの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:[email protected]: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-シャープドライバーV.2.0を使用してPowerShellのにこれを変換する方法を理解するためにあなたの助けが必要.2

+1

ドライバのバージョンは非常に古いので、最新のものに更新する必要があります。 –

+0

もし私が@PeteGarafanoをしたら、私はジェネリックスに入りますし、何らかの理由で上記のコードが何を達成することができる作業用コードも見つけられませんでした。 –

+0

@PeteGarafano私はあなたの提案に従うことに決めました - 下の私の解決策を見てください –

答えて

0

[OK]を、私はこの仕事をする方法を見つけました。まったくPowershellではありません。

@PeteGarafanoの提案に続いて、シンプルなVisual Studioクラスライブラリで最新かつ最高のドライバ(NuGet経由でダウンロードされたバージョン2.4.3.23)を使用することに決めました。このので

コードは非常に原油とハードコードされたものの完全で瞬間だけ試験(例えば、ロールがユーザに割り当てられる)

ここクラスライブラリのコードは、です。

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; 
     } 
    } 
} 

本当に空想何もない、が、主なポイントは、(例:https://docs.mongodb.com/manual/reference/command/usersInfo/MongoDBの公式リファレンスドキュメントで説明したように、あなたが任意のコマンドのJSON形式を使用する方法です。

NOTEは:BsonDocumentオブジェクトを構築し、これを行うための別の方法、ありますが、私はそれがあまり直感的な参照がすべてJSONの構文を使用していますので、見つけました。

次に、このライブラリをPSスクリプトで使用しました。ここでの例は次のとおり

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

    $connectionString = "mongodb://username:[email protected]: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のいずれかで同様のことをしようとする人にとって役に立ちます。

関連する問題